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

