AuthorizeAttribute продолжает перенаправление на /Account / Login


Я пытаюсь обернуть свою голову вокруг проверки подлинности форм в ASP.NET MVC. MVC 5 в моем конкретном случае, если это имеет значение.

Мое приложение не использует пароли, только адрес электронной почты в качестве имени пользователя.

При отладке метода Login я ясно вижу, что модель допустима, и мой (пользовательский) MembershipProvider проверяет пользователя, как и ожидалось.
Затем он перенаправляется на предоставленный returnUrl (для целей тестирования у меня есть AuthorizeAttribute on /Home/About).

К сожалению, меня отбрасывает назад в Login просмотр сразу же, так что очевидно, что я упускаю фундаментальный элемент всего процесса (и, как следствие, фундаментальное понимание всего процесса auth/auth, я должен признать, поскольку я редко играю с ним).

Метод входа в систему:

[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; }
}

Соответствующая часть сети.конфигурация:

<system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
</system.web>

Чего я не вижу? Куда же мне смотреть?

2 5

2 ответа:

Вы устанавливаете свой файл cookie с помощью FormsAuthentication. Если вы используете MVC5, они удалили этот тип аутентификации с атрибутом [Authorize].

Поищите это в своей сети.конфиг. Удалите эту строку, если вы хотите использовать FormsAuthentication.

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

Возможно, вы захотите прочитать это о том, почему Microsoft удалила FormsAuthentication в MVC5 и как использовать OWIN вместо этого: http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx

Такое поведение может быть вызвано неправильной настройкой IIS Express.

Проверьте настройки IISExpress. Либо нажав F4 на проект, либо отредактировав файл проекта *.csproj.

  1. установить свойство Anonymous Authentication в Enabled;
  2. задайте свойству Windows Authentication значение Disabled.

Или измените конфигурацию на:

<PropertyGroup>
  <IISExpressAnonymousAuthentication />
  <IISExpressWindowsAuthentication />