我想添加一个简单的登录。所以我认为最好的办法是将证书添加到数据库中,然后查询该证书,如果用户名和密码算法登录。这是行得通的,它查询数据库,然后您登录并重定向到主页。然后,我尝试通过网址访问家庭,并注意到我可以在没有登录的情况下进行访问。所以后来我想,我应该用在家庭控制器的授权属性不起作用
[Authorize]
属性,因为我不想让未经授权的用户访问它,因此应该被重定向到登录页面。这不起作用。当我在控制器上使用授权时,在应用程序中出现错误。
Object reference not set to an instance of an object.
在web.config它看起来像这样:
<authentication mode="Forms">
<forms loginUrl="~/Login/Index" timeout="2880" /> <-- I have changed the login url to my login controller.
</authentication>
我的登录控制器这样。
public ActionResult Index(UserModel model) <-- I query the db in the model.
{
if (!ModelState.IsValid)
{
return View(model);
}
if(!model.IsAdmin(model.UserName, model.Password))
{
ModelState.AddModelError("username", "you are not a admin");
return View(model);
}
FormsAuthentication.SetAuthCookie(model.UserName, false);
return RedirectToAction("Index", "Home");
}
那么如何正确使用这个Authorize属性?我可以用它的方式使用它吗?我在web.config中丢失了什么? 关心!
对此进行了一些更新。因为它不工作,我已将此添加到web.config中:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="5">
</forms>
</authentication>
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear/>
<add name="MyMembershipProvider" type="MyNamespace.MyMembershipProvider"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
userIsOnlineTimeWindow="2"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
并与硬编码的凭据的MembershipProvider:
public class MyMembershipProvider : MembershipProvider
{
public override bool ValidateUser(string username, string password)
{
if (username.Equals("user", StringComparison.CurrentCultureIgnoreCase) && password.Equals("myPassword"))
return true;
else
return false;
}
然后我试图装饰我与授权HomeController的属性是这样的:
[Authorize()]
public class HomeController : Controller
{}
但仍然收到相同的错误。我的意思是我可以登录,但是当我到达“家”时,我得到和以前一样的错误。这在地球上命名是什么?!任何线索?!
问候!
你有没有传入任何东西的'Index'行为?例如,一个只显示空的表单? – Buildstarted
对不起索引行动和哪里? – Tim