ASP.Net Core 3.0合并角色

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

在当前的Web应用程序中,我使用声明“ customRole”(及其值)对用户进行身份验证,并使用属性“ Authorize”(授权)允许/拒绝对操作的访问。一切正常,直到用户使用多个相同类型的声明,并且访问一直被拒绝,并且在调试时我注意到仅为“ customRole”类型创建了一个声明,并且其值更改为带有以下内容的串联字符串这两个值。

我期望两个相同类型的索赔,但是每个索赔具有不同的价值。我正在将ASPNET.Core 3.0与IdentityServer4一起使用,但是从here的文字来看,IdentityServer4并不是问题。

例如,我在IdentityServer端添加这样的声明:

uClaims.Add(new Claim("customRole", "superadmin"));
uClaims.Add(new Claim("customRole", "simpleadmin"));

但是当我进入客户端应用程序时,我得到了这样的声明:

customRole = ["superadmin","simpleadmin"]

这打破了我在客户端应用程序的操作上使用的角色的属性背后的所有逻辑:

[Authorize(Roles = "superadmin")]

我尝试按照上一个链接(here)中讨论的内容进行操作,但问题仍然存在。

是否缺少任何内容,所以索赔被分离,而不是合并为具有不同值的索赔?还是以允许值数组的其他方式使用授权?

还应该提到,我在上个月第一次开始使用Asp.NetCore,IdentityServer4和Roles,我处于学习曲线中。

感谢您的时间,干杯

asp.net-core identityserver4 claims
1个回答
0
投票

您可以在身份验证后更改您的主体,并将该声明转换为多个。

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
        {
          ...
            options.Events = new JwtBearerEvents();
            options.EventsType = typeof(CustomJwtBearerEvents);
        });

        public class CustomJwtBearerEvents : JwtBearerEvents
        {
           public override async Task TokenValidated(TokenValidatedContext context)
           {
              var claims = context.Principal.Claims.ToList();
//write your code
                  claims.Add(new Claim("key", "value"));
                  context.Principal = new ClaimsPrincipal(new ClaimsIdentity(claims, 
    "Bearer"));        }
        }

找到您的特定声明('customclaim'),并检查其值,如果包含多个值,则为每个值添加一个声明。

© www.soinside.com 2019 - 2024. All rights reserved.