设置cookie并验证后,User.Identity.IsAuthenticated返回false

时间:2013-01-24 18:45:14

标签: asp.net-mvc asp.net-mvc-4

我遇到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);
}

2 个答案:

答案 0 :(得分:18)

在调用User.Identity.IsAuthenticated后的下一个请求之前,

FormsAuthentication.SetAuthCookie()将不会设置为true。

请参阅http://msdn.microsoft.com/en-us/library/twk5762b.aspx

  

SetAuthCookie方法向其中任何一个添加表单身份验证票证   Cookie集合,如果CookiesSupported为false,则为URL。   表单身份验证票证提供表单身份验证   信息到浏览器发出的下一个请求。

答案 1 :(得分:1)

它需要额外的往返(RedirectToAction),但这实现了我想要的。此外,我没有在此示例中使用强类型模型,但它演示了这个想法。代码检查用户是否经过身份验证,如果没有设置cookie,则重定向到自身。第二次调用IsAuthenticated时为true,返回View。只需确保您的表单输入名为userName和password。

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