You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JwtRegisteredClaimNames替代URL?解决代码返回null问题

解决方案

一、让原代码正常工作的其他方法

1. 配置认证服务的Claim类型映射

如果你的项目基于ASP.NET Core认证(比如JWT或OpenID Connect),可以在配置认证服务时,把长URL格式的Claim类型映射到标准的JwtRegisteredClaimNames.GivenName,原代码无需修改就能拿到值。

示例1:JWT认证配置

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            // 填写其他必填验证参数(Issuer、Audience、签名密钥等)
            // 映射Claim类型
            ClaimTypeMap = new Dictionary<string, string>
            {
                { "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname", JwtRegisteredClaimNames.GivenName }
            }
        };
    });

示例2:OpenID Connect配置

如果用的是OpenID Connect登录(比如Azure AD、Identity Server),可以用ClaimActions做映射:

services.AddAuthentication().AddOpenIdConnect(options =>
{
    // 填写其他配置(ClientId、Authority等)
    options.ClaimActions.MapUniqueJsonKey(JwtRegisteredClaimNames.GivenName, "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname");
});

2. 自定义Claim常量类替代硬编码URL

如果暂时不想改动认证配置,可以自己封装一个常量类,把长URL存起来,避免重复书写,同时提升代码可维护性:

public static class AppClaimTypes
{
    public const string GivenName = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname";
}

之后代码里直接调用:

var username = user.Claims
                   .FirstOrDefault(x => x.Type == AppClaimTypes.GivenName)
                   .Value;

3. 调整Token生成逻辑(若你控制Token生成)

如果是自己的服务生成JWT Token,直接在创建Claim时使用JwtRegisteredClaimNames.GivenName作为类型,替换掉那个URL:

var claims = new List<Claim>
{
    new Claim(JwtRegisteredClaimNames.GivenName, "用户真实名称"),
    // 其他业务Claim
};

var jwtToken = new JwtSecurityToken(
    issuer: "你的Issuer地址",
    audience: "你的Audience标识",
    claims: claims,
    expires: DateTime.UtcNow.AddHours(1),
    signingCredentials: new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256)
);

这样原代码就能直接通过JwtRegisteredClaimNames.GivenName获取到值。

二、用ClaimNames替代URL的方法

核心是将URL格式的Claim类型映射到标准的ClaimNames枚举值,也就是上面提到的第一种方法:在认证服务配置中,通过ClaimTypeMap(JWT场景)或ClaimActions(OpenID Connect场景)把URL类型和JwtRegisteredClaimNames.GivenName关联起来。映射完成后,原代码无需修改,就能通过JwtRegisteredClaimNames.GivenName拿到对应的Claim值。

内容的提问来源于stack exchange,提问作者Gandalf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:23:27