Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查用户是否处于单个角色?在.NET Core 3.1中使用标识_C#_Asp.net Core_.net Core_Asp.net Identity_Identity - Fatal编程技术网

C# 如何检查用户是否处于单个角色?在.NET Core 3.1中使用标识

C# 如何检查用户是否处于单个角色?在.NET Core 3.1中使用标识,c#,asp.net-core,.net-core,asp.net-identity,identity,C#,Asp.net Core,.net Core,Asp.net Identity,Identity,如何检查当前用户是否处于单个角色 在我的应用程序中,我可以让一个用户扮演多个角色,但有些角色(如Role1)具有特定的行为。 当用户有两个角色(Role1和Role2)时,如何将特定行为与Role1隔离? 如果用户在Role2中,那么他们应该有另一种行为,即使他们也在Role1中 我想出的解决办法是 if (User.IsInRole(Role1.ToString()) && !User.IsInRole(Role2.ToString())) { //implementat

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

在我的应用程序中,我可以让一个用户扮演多个角色,但有些角色(如
Role1
)具有特定的行为。 当用户有两个角色(
Role1
Role2
)时,如何将特定行为与
Role1
隔离? 如果用户在
Role2
中,那么他们应该有另一种行为,即使他们也在
Role1

我想出的解决办法是

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

还有别的办法吗?也许使用保险单?

我想保险单对你的情况来说是最好的办法。 在生成器中创建使用Requiremeartion的策略

请参阅本帖:

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

用户成功登录后,可以使用获取指定用户所属角色名称的列表。然后,根据结果检查用户是否处于单个角色

            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);
            }
屏幕截图如下:

    [Authorize(Policy = "readpolicy")]
    public IActionResult Index()
    {
        var roles = roleManager.Roles.ToList();
        return View(roles);
    }
    [Authorize(Policy = "writepolicy")]
    public IActionResult Create()
    {
        return View(new IdentityRole());
    }

当用户有两个角色时,如何将特定行为与角色1隔离 角色(角色1和角色2)?如果用户在角色2中,那么他们应该 另一种行为,即使他们也在角色1中。还有别的办法吗?也许使用政策

是的,基于策略的授权是一个不错的选择。例如,在我的示例中,有3种角色:管理员、经理和用户

我们可以在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方法

参考:


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

    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);
    }

获得了一个链接或更多关于如何做的信息吗?@ViniciusBassi更新了答案,你应该编码到权限(或)“声明”。这是短视的,很难维护为角色编写的代码。考虑:这并不能解决我的问题,但是当我编写一个解决方案时,它对我很有帮助。