AuthorizeAttribute会不断重定向到/Account/Login页面

8
我正在努力理解ASP.NET MVC中的表单身份验证。在我的特定案例中,是MVC 5,如果有区别的话。
我的应用程序不使用密码,只是将电子邮件地址作为用户名。
当调试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>

我可能忽略了什么?我应该把注意力放在哪里?


我并不是专家,但是当你逐步执行代码时,视图模型是否变得有效?除此之外,我会使用IsAuthorised而不是授权属性。 - jbutler483
@jbutler483 是的,如果没有重定向,就不会有任何重定向。 - Wim Ombelets
但是在逐步执行您的代码时,您还应该能够看到哪个部分失败了? - jbutler483
2个回答

4

您正在使用FormsAuthentication设置cookie。如果您使用的是MVC5,则可以使用[Authorize]属性来删除该类型的身份验证。

在您的web.config中查找此内容。如果要使用FormsAuthentication,请删除该行。

  <system.webServer>
    <modules>
      <remove name="FormsAuthentication" />
    </modules>
  </system.webServer>

您可能想了解为什么 Microsoft 在 MVC5 中删除了 FormsAuthentication,以及如何使用 OWIN 代替它,请阅读以下内容:http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx


太棒了!非常感谢! - Wim Ombelets

0

这种行为可能是由于 IIS Express 的设置不正确引起的。

检查 IISExpress 设置。 可以通过在项目上按下 F4 或编辑项目文件 *.csproj 来进行设置。

  1. 将属性 匿名身份验证 设置为 启用
  2. 将属性 Windows 身份验证 设置为 禁用

或者编辑配置为:

<PropertyGroup>
  <IISExpressAnonymousAuthentication />
  <IISExpressWindowsAuthentication />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接