我将首先介绍导致我遇到角色授权问题的步骤。
首先,我在我的委托人中添加 2 个角色HomeController.cs
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>
}
并通过在我的 HomeController 中检查它[Authorize(Roles = "Admin")]
。
然后它失败了两次。if(User.IsInRole("Admin"))
返回 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
不能按照上面的方式更改,请发布您的答案,谢谢。