如何检查当前用户是否处于单一角色?
在我的应用程序中,我可以让一个用户具有多个角色,但是,某些角色(例如
Role1
)具有特定的行为。
当用户具有两个角色(Role1
和 Role1
)时,如何将特定行为与 Role2
隔离?
如果用户处于 Role2
状态,那么他们应该有另一种行为,即使他们也处于 Role1
状态。
我想出的解决方案是
if (User.IsInRole(Role1.ToString()) && !User.IsInRole(Role2.ToString()))
{
//implementation
}
还有其他方法可以做到这一点吗?也许使用政策?
如何检查当前用户是否处于单一角色?
用户登录成功后,可以使用UserManager.GetRoleAsync()方法获取指定用户所属的角色名列表。然后根据结果检查用户是否属于单一角色。
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
var user = _userManager.FindByEmailAsync(Input.Email).Result;
var roles = _userManager.GetRolesAsync(user).Result.ToArray();
// then, based on the roles array to check if the current user is in a single role.
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
截图如下:
当用户有两个角色时,如何将特定行为与 Role1 隔离 角色(角色 1 和角色 2)?如果用户属于 Role2 那么他们应该有 另一种行为,即使他们也在 Role1 中。还有其他方法可以做到这一点吗?也许使用政策?
是的,基于策略的授权是一个不错的选择。例如,在我的示例中,有 3 种角色:Admin、Manager 和 User。
我们可以在 Startup.cs 文件中创建以下策略,
services.AddAuthorization(options => {
options.AddPolicy("readpolicy",
builder => builder.RequireRole("Admin", "Manager", "User"));
options.AddPolicy("writepolicy",
builder => builder.RequireRole("Admin", "Manager"));
});
然后,我们将这些策略应用到角色控制器,如下所示:
[Authorize(Policy = "readpolicy")]
public IActionResult Index()
{
var roles = roleManager.Roles.ToList();
return View(roles);
}
[Authorize(Policy = "writepolicy")]
public IActionResult Create()
{
return View(new IdentityRole());
}
现在我们可以根据策略来调用action方法了。
参考:
我认为政策是针对您的情况的最佳方法。 创建在构建器中使用 RequireAssertion 的策略
我的解决方案是创建一种方法来检查用户是否处于任何角色中:
public async Task<bool> IsInAnyRoleAsync(TUser user, RoleEnum[] roles)
{
var userIsInRole = new List<bool>();
foreach (var role in roles)
{
var roleName = Enum.GetName(role.GetType(), role);
userIsInRole.Add(await IsInRoleAsync(user, roleName));
}
return userIsInRole.Any(isInRole => isInRole == true);
}