MVC 4:User.IsInRole()在注销后返回false

本文关键字:注销 返回 false User IsInRole MVC | 更新日期: 2023-09-27 18:22:09

我的MVC web表现得很奇怪。当我第一次登录时,User.IsInRole("Admin")返回true,一切正常。

但在我登录和注销后,当我再次尝试登录时,User.IsInRole("Admin")总是返回false。但这个问题在我尝试再次登录后得到了解决。

这是代码:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    string redirectUrl = returnUrl;
    string userName = model.UserName;
    UserProfile user = dbAccount.UserProfiles.Where(m => m.Email.Equals(userName, StringComparison.CurrentCultureIgnoreCase)).SingleOrDefault();
    if (user != null)
    {
        userName = user.UserName;
    }
    if (ModelState.IsValid && WebSecurity.Login(userName, model.Password, persistCookie: model.RememberMe))
    {
        if (redirectUrl == null)
        {
            redirectUrl = User.IsInRole("Admin") ? "/Admin" : "/";
        }
        return RedirectToLocal(redirectUrl);
    }
    // If we got this far, something failed, redisplay form
    ModelState.AddModelError("", "The user name or password provided is incorrect.");         
    return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    WebSecurity.Logout();
    Roles.DeleteCookie();
    return RedirectToAction("Home", "Page");
}

不知怎么的,在我注销和登录后,WebSecurity.login()没有给我正确的用户角色。

MVC 4:User.IsInRole()在注销后返回false

您的问题是User.IsInRole()方法从身份验证cookie中序列化的身份验证令牌中获取角色。在您的登录操作中,cookie尚未解析,因此User.IsInRole()将始终返回false。

为什么它在第一次登录时有效:我的假设是,在第一次登录时,您的用户已经登录(cookie就在那里),这就是User.IsInRole("Admin")返回true的原因。为了在登录前测试它(当你在登录页面上时),清除所有浏览器cookie并尝试登录——我假设你会得到User.IsInRole("Admin")是假的。

但在我登录和注销后,当我再次尝试登录时,User.IsInRole("Admin")总是返回false:注销时,您会删除身份验证cookie,因此在登录操作中,cookie不存在,这就是User.IsInRole("Admin")为false的原因。

由于这个cookie将在登录后的请求中解析,因此您可以这样做:

更新

public ActionResult Login(LoginModel model, string returnUrl)
{
    string redirectUrl = returnUrl;
    string userName = model.UserName;
    UserProfile user = dbAccount.UserProfiles.Where(m => m.Email.Equals(userName, StringComparison.CurrentCultureIgnoreCase)).SingleOrDefault();
    if (user != null)
    {
        userName = user.UserName;
    }
    if (ModelState.IsValid && WebSecurity.Login(userName, model.Password, persistCookie: model.RememberMe))
    {
        return  this.RedirectToAction("AdminRedirect","Account", new {redirectUrl = redirectUrl});           
    }
    // If we got this far, something failed, redisplay form
    ModelState.AddModelError("", "The user name or password provided is incorrect.");         
    return View(model);
}

public ActionResult AdminRedirect(string redirectUrl)
{
     if (redirectUrl == null)
     {
           redirectUrl = User.IsInRole("Admin") ? "/Admin" : "/";
     }
     return this.RedirectToLocal(redirectUrl);
 }

通过这种方式,重定向后会检查用户角色,因此AdminRedirect内部的操作身份验证cookie将被解析,用户角色将被更新。