我的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()不能给我正确的用户角色。
答案 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并更新用户角色。