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);
}
Ответы
Ответ 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);
}