C# &引用;角色“;token-NET CORE 3.1和;IS4

C# &引用;角色“;token-NET CORE 3.1和;IS4,c#,cookies,oauth-2.0,identityserver4,asp.net-core-3.1,C#,Cookies,Oauth 2.0,Identityserver4,Asp.net Core 3.1,我有一个服务,负责验证用户 更新后: 从2.3.2到4.0.2的IdentityServer4 出现了一个问题: 令牌不再包含所需的用户声明 服务的配置方式如下: Startup.cs包含: 在更新IS4之前,控制器如下所示: 在受保护的api项目中: 尝试验证控制器请求时(在不同的api项目中): 受保护api项目的启动包含: builder.AddAuthorization(ConfigureAuthorization); var auth = builder.Serv

我有一个服务,负责验证用户

更新后:

  • 从2.3.2到4.0.2的IdentityServer4
出现了一个问题:

  • 令牌不再包含所需的用户声明
服务的配置方式如下:

  • Startup.cs包含:
  • 在更新IS4之前,控制器如下所示:
在受保护的api项目中:

  • 尝试验证控制器请求时(在不同的api项目中):
受保护api项目的启动包含:

builder.AddAuthorization(ConfigureAuthorization);

var auth = builder.Services.AddAuthentication(ConfigureAuthenticationOptions);

auth.AddIdentityServerAuthentication(ConfigureIdentityServerAuthentication);
ConfigureIdentityServerAuthentication
方法设置一些
IdentityServerAuthenticationOptions
。未设置
RoleClaimType
,因为它有一个默认值
“角色”
,这是预期值

IdentityServerAuthenticationOptions
来自3.0.1版的“IdentityServer4.AccessTokenValidation”软件包

以下是两个屏幕截图,证明已设置
RoleClaimType

  • 在Startup.cs上的授权服务上:

  • AuthorizeRoles
    属性的OnAuthorization方法上:

问题是:

  • 为什么令牌不包含添加到ClaimSideEntity对象的所有声明
  • 如何修复此问题以使令牌再次包含“角色”声明
涉及的技术:

  • 净核心3.1
  • IdentityServer4.0.2

默认情况下,IdentityServer和ASP.NET core对RoleClaim的名称有不同的意见

在客户端中添加此代码以修复该映射(设置TokenValidationParameters选项)

此外,查看Fiddler中的各种请求可以帮助您解决索赔问题

将此设置为True也有助于:

options.GetClaimsFromUserInfoEndpoint = true;

你能告诉我哪一个类实例是所提到的“选项”对象吗?由于我无法在以下两个类中找到“TokenValidationParameters”属性:“AuthenticationOptions”、“AuthorizationOptions”,“IdentityServerAuthenticationOptions”。在“IdentityServerAuthenticationOptions”上似乎有一个属性RoleClaimType-它在内部设置TokenValidationParameters.RoleClaimType-我已经尝试过了,但没有任何区别-声明仍然丢失。还有“IdentityServerAuthenticationOptions”具有默认值-这些值来自JwtClaimTypes。我在设置TokenValidationParameters的答案中添加了这些值。这可能是客户端问题,您需要正确映射AddOpenIdConnect方法中接收到的值。我最初会使用Fiddler调查客户机和IdentityServer之间的通信量,以确保客户机确实收到所需的声明。在您知道您确实收到了所需的声明之后,您有一些选项可以将它们映射到角色,例如,确切地说,哪些声明应该添加,哪些声明应该删除。此外,当您升级到v4.0x时,还需要确保添加APiscope。将更新答案。(添加了MapUniqueJsonKey)
await HttpContext.SignInAsync(user.SubjectId, props, user.Claims.ToArray());
// attribute for validating roles on controllers
[AuthorizeRoles(Role.SimpleRole)] // which implements IAuthorizationFilter

// And the implementation:
public void OnAuthorization(AuthorizationFilterContext context)
{
    var user = context.HttpContext.User;
    // user is of type 'ClaimsIdentity'
    // and it does not contain the "role" claim
 
    // some checks to verify the user here...
}

builder.AddAuthorization(ConfigureAuthorization);

var auth = builder.Services.AddAuthentication(ConfigureAuthenticationOptions);

auth.AddIdentityServerAuthentication(ConfigureIdentityServerAuthentication);
       services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        }).AddCookie(options =>
        {
            options.LoginPath = "/User/Login";
            options.LogoutPath = "/User/Logout";
            options.AccessDeniedPath = "/User/AccessDenied";
        }).AddOpenIdConnect(options =>
        {
            options.Authority = "https://localhost:6001";
            options.ClientId = "authcodeflowclient";
            options.ClientSecret = "mysecret";
            options.ResponseType = "code";

            options.Scope.Clear();
            options.Scope.Add("openid");
            options.Scope.Add("profile");
            options.Scope.Add("email");
            options.Scope.Add("employee_info");


            //Map the custom claims that should be included
            options.ClaimActions.MapUniqueJsonKey("employment_start", "employment_start");
            options.ClaimActions.MapUniqueJsonKey("seniority", "seniority");
            options.ClaimActions.MapUniqueJsonKey("contractor", "contractor");
            options.ClaimActions.MapUniqueJsonKey("employee", "employee");
            options.ClaimActions.MapUniqueJsonKey("management", "management");
            options.ClaimActions.MapUniqueJsonKey(JwtClaimTypes.Role, JwtClaimTypes.Role);

            options.SaveTokens = true;
            options.SignedOutRedirectUri = "/";
            options.GetClaimsFromUserInfoEndpoint = true;



            options.TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = JwtClaimTypes.Name,
                RoleClaimType = JwtClaimTypes.Role,

            };

            options.Prompt = "consent";
        });
options.GetClaimsFromUserInfoEndpoint = true;