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);
}
3 ответа

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

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

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


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

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

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

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

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

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


Для этого требуется дополнительный 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);
}

licensed under cc by-sa 3.0 with attribution.