Подтвердить что ты не робот

User.Identity.IsAuthenticated возвращает false после установки cookie и проверки

У меня возникла проблема с авторизацией пользователя MVC4.

System.Web.Security.Membership.ValidateUser возвращает true.
Затем он доходит до FormsAuthentication.SetAuthCookie, и я вижу cookie в своем браузере.
По какой-то причине User.Identity.IsAuthenticated по-прежнему оценивает значение false.
User.Identity.IsAuthenticated по-прежнему остается ложным после перенаправления и остается false.

[AllowAnonymous]
[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (System.Web.Security.Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}
4b9b3361

Ответ 1

User.Identity.IsAuthenticated не будет установлено значение true до следующего запроса после вызова FormsAuthentication.SetAuthCookie().

См. http://msdn.microsoft.com/en-us/library/twk5762b.aspx

Метод SetAuthCookie добавляет билет для проверки подлинности формы для любого коллекция файлов cookie или URL-адрес, если CookiesSupported является ложным. Бланк для проверки подлинности форм информацию на следующий запрос, сделанный браузером.

Ответ 2

Проверьте свой webconfig, вы должны включить проверку подлинности на основе форм:

Добавьте следующий фрагмент внутри

   <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="3600" />
    </authentication>

Прокомментируйте, находится ли он в вашем webconfig:

<!--<modules>
      <remove name="FormsAuthentication" />
</modules>-->

Теперь вы можете проверить

WebSecurity.CurrentUserName, WebSecurity.CurrentUserId и флаги WebSecurity.IsAuthenticated;

Ответ 3

Для этого требуется дополнительный roundtrip (RedirectToAction), но это выполнило то, что я хотел. Также я не использую строго типизированную модель в этом примере, но она демонстрирует эту идею. Код проверяет, аутентифицирован ли пользователь, и если он не задает куки файл, он перенаправляется на себя. Второй раз, когда он называется IsAuthenticated, это true, и возвращается вид. Просто убедитесь, что ваши входы формы названы userName и пароль.

[AllowAnonymous]
[HttpPost]
public ActionResult Login(string userName, string password, string returnUrl)
{
if (ModelState.IsValid)
{
    if (HttpContext.User.Identity.IsAuthenticated)
    {
        return View(returnUrl);
    }
    else
    {
        if (System.Web.Security.Membership.ValidateUser(userName, password))
        {
            FormsAuthentication.SetAuthCookie(userName, false);
            if (Url.IsLocalUrl(returnUrl))
            {
                return RedirectToAction("Login", new { userName = userName, password = password, returnUrl = returnUrl });
                //return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
    }
    else
    {
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
    }
}

// If we got this far, something failed, redisplay form
return View(model);
}