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

如何让ASP.NET Core不转换JWT令牌中的声明类型?

问题解答

为什么ASP.NET Core会转换JWT声明类型?

这是ASP.NET Core的JWT认证中间件默认行为:它会按照JWT标准声明到.NET标准声明类型的映射规则,把JWT里的短名称声明(如sub、name、family_name)自动转换为System.Security.Claims.ClaimTypes中定义的长URI格式类型。

这么做是为了兼容.NET原生的身份认证体系——.NET的Claims系统原本就使用这类URI格式的标识,自动转换后能让代码更好地适配.NET内置的身份验证、授权逻辑(比如角色授权、ClaimsPrincipal的扩展方法)。

如何阻止这种转换?

要关闭自动映射,只需在配置JWT认证时,清空JwtSecurityTokenHandler的默认声明类型映射规则即可。

具体实现代码

根据你的ASP.NET Core版本,在Program.cs(或Startup.cs)的认证配置中添加以下逻辑:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        // 保留你的原有配置(如颁发者、受众、签名密钥等)
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };

        // 清空默认声明映射,保留JWT原声明名称
        options.SecurityTokenValidators.Clear();
        var jwtHandler = new JwtSecurityTokenHandler();
        jwtHandler.InboundClaimTypeMap.Clear();
        options.SecurityTokenValidators.Add(jwtHandler);
    });

补充说明

  • 清空InboundClaimTypeMap后,HttpContext.User.Identity.Claims中的声明类型会和JWT令牌里的完全一致,比如sub、name都会原样保留。
  • 如果只需修改个别声明的映射(而非全部清空),可以单独移除或修改对应项:
// 移除sub的默认映射
jwtHandler.InboundClaimTypeMap.Remove("sub");
// 或者自定义映射规则
// jwtHandler.InboundClaimTypeMap["sub"] = "custom-sub-claim-type";

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:17:42