我正在努力理解ASP.NET MVC中的表单身份验证。在我的特定案例中,是MVC 5,如果有区别的话。
我的应用程序不使用密码,只是将电子邮件地址作为用户名。
当调试Login方法时,我可以清楚地看到模型是有效的,并且我的(自定义)MembershipProvider按预期验证了用户。 然后它重定向到提供的returnUrl(出于测试目的,在 /Home/About 上有一个AuthorizeAttribute)。
遗憾的是,我立即被抛回到Login视图,因此很明显我缺少整个过程的基本要素(以及整个身份验证/授权过程的基本见解,我必须承认,因为我很少玩这个)。
登录方法:
Web.config文件的相关部分:
我的应用程序不使用密码,只是将电子邮件地址作为用户名。
当调试Login方法时,我可以清楚地看到模型是有效的,并且我的(自定义)MembershipProvider按预期验证了用户。 然后它重定向到提供的returnUrl(出于测试目的,在 /Home/About 上有一个AuthorizeAttribute)。
遗憾的是,我立即被抛回到Login视图,因此很明显我缺少整个过程的基本要素(以及整个身份验证/授权过程的基本见解,我必须承认,因为我很少玩这个)。
登录方法:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if(ModelState.IsValid && Membership.ValidateUser(model.Email, ""))
{
FormsAuthentication.SetAuthCookie(model.Email, model.RememberMe);
if (Url.IsLocalUrl(returnUrl))
{
return RedirectToLocal(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "Email address unknown");
}
return View(model);
}
LoginViewModel:
public class LoginViewModel
{
[Required]
[Display(Name = "Email")]
[EmailAddress]
public string Email { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
Web.config文件的相关部分:
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
</system.web>
我可能忽略了什么?我应该把注意力放在哪里?