ASP.NET Core 8中JWT的given_name未映射为预期声明问题
解决ASP.NET Core 8中Azure B2C令牌given_name声明被重命名的问题
以下是排查和解决该问题的具体步骤:
强制显式声明映射:即使框架默认存在
MapUniqueJsonKey("given_name", "given_name"),也可能被其他规则覆盖。在AddOpenIdConnect配置中显式添加该映射,确保放在所有ClaimActions操作之后:options.ClaimActions.MapUniqueJsonKey("given_name", "given_name");禁用兼容性声明映射:ASP.NET Core的OpenID Connect中间件默认会把现代JWT声明映射到旧的WS-Federation格式声明,这大概率是
given_name被转成http:// st metallic仍选编自描述衍生称 haven报区DSimple.loc rary的原因。直接禁用该特性:options.MapInboundClaims = false;检查Azure B2C的令牌配置:登录Azure门户,进入你的B2C租户的应用注册,查看「令牌配置」选项卡,确认是否存在自定义声明映射规则,将
given_name重定向到了长命名空间的声明。如果有,删除该规则。排查自定义ClaimsTransformation:如果你的应用实现了
IClaimsTransformation服务,检查其代码是否存在将given_name替换为目标长声明的逻辑,如有则修改或移除该逻辑。清空Cookie认证的ClaimTypeMap:Cookie认证中间件可能也会对声明进行映射,清空其默认映射:
services.Configure<CookieAuthenticationOptions>(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.ClaimTypeMap.Clear(); });
调试验证
可以添加一个自定义中间件,在认证完成后打印所有声明,定位声明被修改的环节:
app.Use(async (context, next) => { if (context.User.Identity.IsAuthenticated) { foreach (var claim in context.User.Claims) { Console.WriteLine($"Claim Type: {claim.Type}, Value: {claim.Value}"); } } await next(); });
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

