Owin声明 - 添加多个ClaimTypes.Role

Jep*_*sen 22 c# asp.net-mvc claims-based-identity

我有一个应用程序,可以为用户分配以下角色:

  • 超级管理员
  • 管理员
  • 用户

一个用户可能已经分配了两个或更多个角色,例如.SuperAdmin和用户.我的应用程序使用声明,因此我也希望通过声明来验证用户角色.喜欢:

[Authorize(Roles="Admin")]
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道如何将多个角色添加到我的ClaimTypes.Role.我有以下代码:

var identity = new ClaimsIdentity(new[] {
                new Claim(ClaimTypes.Name, name),
                new Claim(ClaimTypes.Email, email),
                new Claim(ClaimTypes.Role, "User", "Admin", "SuperAdmin")
        },
            "ApplicationCookie");
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我试图为了说明而添加更多角色,但显然它以错误的方式完成,因此无效.因此,非常感谢任何帮助.

Par*_*Rao 46

声明标识可以具有多个具有相同ClaimType的声明.这样就可以使用HasClaim方法检查特定用户角色是否存在.

var identity = new ClaimsIdentity(new[] {
            new Claim(ClaimTypes.Name, name),
            new Claim(ClaimTypes.Email, email),
            new Claim(ClaimTypes.Role, "User"),
            new Claim(ClaimTypes.Role, "Admin"), 
            new Claim(ClaimTypes.Role,"SuperAdmin")
    },
        "ApplicationCookie");
Run Code Online (Sandbox Code Playgroud)

  • @TAHASULTANTEMURI 如果 ```roles``` 在列表中,您可以执行 ```foreach (var role in Roles) Claims.Add(new Claim(ClaimTypes.Role, role));``` (3认同)

TAH*_*URI 8

@Parameswar Rao 解释得很好,但在动态角色的情况下

例如,用户对象已经具有列表类型的属性角色,例如

在此输入图像描述

然后使用局部函数

  ClaimsIdentity getClaimsIdentity()
                {
                    return new ClaimsIdentity(
                        getClaims()
                        );

                   Claim[] getClaims()
                    {
                        List<Claim> claims = new List<Claim>();
                        claims.Add(new Claim(ClaimTypes.Name, user.UserName));
                        foreach (var item in user.Roles)
                        {
                            claims.Add(new Claim(ClaimTypes.Role, item));
                        }
                        return claims.ToArray();
                    }

                }
                    var tokenDescriptor = new SecurityTokenDescriptor
                    {


                        Subject = getClaimsIdentity()
                    }
Run Code Online (Sandbox Code Playgroud)