首页 > 解决方案 > OpenIddict 3 验证选项

问题描述

在 OpenIddict 3.1.1 中,我想了解在验证令牌以将 NameClaimType 映射到 Subject 声明时修改 TokenValidationParameters 的推荐方法是什么。

我正在从 OpenIddict 版本 2 升级到 3.1.1。我在我们的解决方案中配置了使用 OpenIddict 版本 2 来使用 JWT 令牌的东西,如 OpenIddict 示例项目中所示。该项目的代码如下所示:

            // If you prefer using JWT, don't forget to disable the automatic
            // JWT -> WS-Federation claims mapping used by the JWT middleware:
            
             JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
             JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
            
             app.UseJwtBearerAuthentication(new JwtBearerOptions
             {
                 Authority = "http://localhost:52698/",
                 Audience = "resource_server",
                 RequireHttpsMetadata = false,
                 TokenValidationParameters = new TokenValidationParameters
                 {
                     NameClaimType = OpenIdConnectConstants.Claims.Subject,
                     RoleClaimType = OpenIdConnectConstants.Claims.Role
                 }
            });

注意线 NameClaimType = OpenIdConnectConstants.Claims.Subject,

现在在我所有的 .NET 控制器中,当我引用 User.Identity.Name 该值时,子声明映射到我的身份用户 ID 值,这是我想要的行为。

我知道 JWT 令牌支持现在在 Open Iddict 3.1.1 中配置为默认设置,迁移指南建议升级到 OpenIddict 验证处理程序。按照迁移指南升级到版本 3.1.1 后,我的 User.Identity.Name值现在映射到我的用户名,而不是 sub 声明。(这破坏了我的很多服务器端功能)

OpenIddict 3.1.1 中修改 TokenValidationParameters 以将 NameClaimType 映射到子声明的推荐方法是什么?

更新

我一直无法弄清楚如何配置它。查看源代码,这似乎是不可配置的-在 OpenIddictValidationOptions.cs 类中,我看到了以下代码:

     {
     AuthenticationType=TokenValidationParameters.DefaultAuthenticationType,
     ClockSkew = TimeSpan.Zero,
     NameClaimType = Claims.Name,
     RoleClaimType = Claims.Role,

NameClaimType 似乎不是可覆盖的 - 这是它被分配给“名称”声明的地方。

因此,我将更新我的控制器端点以以不同的方式获取 UserId 子声明。

我想我的问题是,为什么在 OpenIddict 示例中必须使用“sub”声明验证 JWT 令牌,而在新版本中它使用“name”声明?

标签: jwtasp.net-identityclaims-based-identityopeniddict

解决方案


推荐阅读