如何检查用户是否处于单一角色?在 .NET Core 3.1 中使用身份
How to check if a User is in a single role? Using Identity in .NET Core 3.1
如何检查当前用户是否处于单一角色?
在我的应用程序中,我可以让一个用户担任多个角色,但是,某些角色(例如 Role1
)具有特定的行为。
当用户有两个角色(Role1
和 Role2
)时,如何将特定行为与 Role1
隔离?
如果用户在 Role2
那么他们应该有另一种行为,即使他们也在 Role1
。
我想到的解决方案是
if (User.IsInRole(Role1.ToString()) && !User.IsInRole(Role2.ToString()))
{
//implementation
}
还有其他方法吗?也许使用策略?
我想这是处理您的情况的最佳方法的政策。
在 builder
中创建一个使用 RequireAssertion 的策略
看这个 post:
How do I check if the current user is in a single role?
用户登录成功后,您可以使用UserManager.GetRoleAsync() method获取指定用户所属的角色名称列表。然后根据结果判断用户是否在单个Role中。
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);
}
截图如下:
How do I isolate the specific behavior from Role1 when a user have two
roles(Role1 and Role2)? If the user is in Role2 then they should have
another behavior, even if they are in Role1 as well. Is there another way to do this? Maybe using policies?
是的,基于策略的授权是一个不错的选择。例如,在我的示例中,有 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());
}
现在,我们可以根据策略来调用动作方法了。
参考:
我的解决方案是创建一个方法来检查用户是否在任何角色中:
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);
}
用法:
await _userManager.IsInAnyRoleAsync(user, [Role1, Role2]);
如何检查当前用户是否处于单一角色?
在我的应用程序中,我可以让一个用户担任多个角色,但是,某些角色(例如 Role1
)具有特定的行为。
当用户有两个角色(Role1
和 Role2
)时,如何将特定行为与 Role1
隔离?
如果用户在 Role2
那么他们应该有另一种行为,即使他们也在 Role1
。
我想到的解决方案是
if (User.IsInRole(Role1.ToString()) && !User.IsInRole(Role2.ToString()))
{
//implementation
}
还有其他方法吗?也许使用策略?
我想这是处理您的情况的最佳方法的政策。 在 builder
中创建一个使用 RequireAssertion 的策略看这个 post:
How do I check if the current user is in a single role?
用户登录成功后,您可以使用UserManager.GetRoleAsync() method获取指定用户所属的角色名称列表。然后根据结果判断用户是否在单个Role中。
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);
}
截图如下:
How do I isolate the specific behavior from Role1 when a user have two roles(Role1 and Role2)? If the user is in Role2 then they should have another behavior, even if they are in Role1 as well. Is there another way to do this? Maybe using policies?
是的,基于策略的授权是一个不错的选择。例如,在我的示例中,有 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());
}
现在,我们可以根据策略来调用动作方法了。
参考:
我的解决方案是创建一个方法来检查用户是否在任何角色中:
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);
}
用法:
await _userManager.IsInAnyRoleAsync(user, [Role1, Role2]);