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()没有给我正确的用户角色。
您的问题是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将被解析,用户角色将被更新。