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

时间:2015-11-17 09:56:55

标签: c# asp.net-mvc security asp.net-mvc-4

我的MVC网站表现得很奇怪。当我第一次登录时,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()不能给我正确的用户角色。

1 个答案:

答案 0 :(得分:1)

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

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

但在我登录并退出后,当我再次尝试登录时,User.IsInRole(“Admin”)始终返回false: 当您注销时,您删除了身份验证cookie,因此在Login操作中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); } 为false的原因。

由于此cookie将在登录后的请求中进行解析,您可以执行以下操作:

<强>已更新

AdminRedirect

这样,重定向后会检查用户角色,因此在abstract内部将会解析操作身份验证cookie并更新用户角色。