如何检查用户是否处于单一角色?在 .NET Core 3.1 中使用身份

问题描述 投票:0回答:3

如何检查当前用户是否处于单一角色?

在我的应用程序中,我可以让一个用户具有多个角色,但是,某些角色(例如

Role1
)具有特定的行为。 当用户具有两个角色(
Role1
Role1
)时,如何将特定行为与
Role2
隔离? 如果用户处于
Role2
状态,那么他们应该有另一种行为,即使他们也处于
Role1
状态。

我想出的解决方案是

if (User.IsInRole(Role1.ToString()) && !User.IsInRole(Role2.ToString()))
{
   //implementation
}

还有其他方法可以做到这一点吗?也许使用政策?

c# asp.net-core .net-core asp.net-identity identity
3个回答
3
投票

如何检查当前用户是否处于单一角色?

用户登录成功后,可以使用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方法了。

参考:

向 ASP.NET MVC Core 应用程序添加角色授权

ASP.NET Core 中基于策略的授权


0
投票

我认为政策是针对您的情况的最佳方法。 创建在构建器中使用 RequireAssertion 的策略

参见这篇文章:ASP.NET Core 3.1 中基于身份和外部登录的基于角色的授权


0
投票

我的解决方案是创建一种方法来检查用户是否处于任何角色中:

    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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.