【发布时间】:2019-05-24 08:36:58
【问题描述】:
我将首先介绍导致我遇到角色授权问题的步骤。
首先,我在 HomeController.cs 的委托人中添加 2 个角色
public HomeController()
{
_db = new ApplicationDbContext();
_roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(_db));
_userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));
List<string> roles = new List<string>()
{
"User", "Admin"
};
foreach(string role in roles)
{
if (!_roleManager.RoleExists(role))
{
_roleManager.Create(new IdentityRole(role));
}
}
}
角色已成功添加到数据库中。
然后我在AccountController.cs的注册任务中为新注册用户添加角色
...
if (result.Succeeded)
{
await UserManager.AddToRoleAsync(user.Id, "User");
...
角色User已成功分配给新用户(在表中:AspNetUserRoles)
如果我像这样将此用户角色更改为Admin:
string userId = User.Identity.GetUserId<string>();
_userManager.RemoveFromRole(userId, "User");
_userManager.AddToRole(userId, "Admin");
并像这样在我的视图(Razor)中检查它:
@if(User.IsInRole("Admin"))
{
<p> ok </p>
}
然后通过[Authorize(Roles = "Admin")] 在我的 HomeController 中检查它。
然后它失败了两次。 if(User.IsInRole("Admin")) return false 和 [Authorize(Roles = "Admin")] 也不允许我访问它下面的方法。
此外,这个新注册用户只有User 角色,因为[Authorize(Roles = "User")] 有效并且if(User.IsInRole("User")) 也返回true。
奇怪的是IList<string> roles:
string userId = User.Identity.GetUserId<string>();
IList<string> roles = _userManager.GetRoles(userId);
当通过_userManager.AddToRole(userId, "Admin"); 添加新角色时,实际上正确地返回了新角色列表,因此默认角色User 的用户现在只有1 个角色Admin(因为我删除了以前的角色),这看起来很合乎逻辑并且有效。
如果您知道为什么我的默认角色 User 无法按照上述方式更改,请发布您的答案,谢谢。
【问题讨论】:
-
您是否尝试注销然后为该用户重复登录过程?通常要立即使用
AddToRole[Async]分配的新角色设置User.IsInRole,您需要使用FindById(),然后使用CreateIdentity()和auth cookie并通过SignIn()重做身份验证过程。 -
重新登录有效,但我不知道如何处理 cookie,因此任何链接都会有所帮助。
-
好吧,既然注销然后重做登录工作正常,你应该做的是在使用
AddToRole强制新角色后立即重新验证用户,以便User.IsInRole为下一个请求返回true。 re-auth 过程应该更新 auth cookie(包含当前用户和角色)。 -
我发现这个有用的答案stackoverflow.com/questions/29285406/…。基本上,我不必手动更新 cookie,因为
SignIn方法可以为我完成。我需要做的就是使用此方法重新登录用户,这样 auth cookie 将与数据库保持同步,对吗?我不知道如何在 ApplicationSignInManager 构造函数中使用第二个参数来创建它的对象以使用SignIn方法
标签: asp.net-mvc roles authorize isinrole