如何让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
相关产品推荐
相关产品推荐

