为何客户端存在OID声明,ASP.NET Web服务中却缺失?
问题原因与解决办法
- 令牌类型差异:你在客户端看到的OID声明来自ID令牌(id_token),但ASP.NET服务端接收的是访问令牌(access_token)。Azure B2C默认不会将OID写入访问令牌,这是核心原因。
- 配置可选声明:登录Azure门户,找到你的B2C应用注册,进入「令牌配置」页面,添加可选声明:
- 声明类型选择「访问令牌」和「ID令牌」
- 勾选
oid声明后保存,确保B2C在颁发访问令牌时包含OID
- 验证令牌内容:用jwt.ms解析服务端收到的访问令牌,确认OID是否存在。如果令牌里没有,说明是B2C配置问题;如果有但User属性里看不到,检查声明映射。
- 调整服务端声明映射:在ASP.NET Core的认证配置中,确保没有过滤OID声明。可以通过以下代码手动配置:
builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration) .AddClaimsPrincipalFactory<MyClaimsPrincipalFactory>(); // 自定义声明工厂示例 public class MyClaimsPrincipalFactory : DefaultClaimsPrincipalFactory { public MyClaimsPrincipalFactory(IAzureADB2COptionsAccessor optionsAccessor) : base(optionsAccessor) { } public override async Task<ClaimsPrincipal> CreateAsync(ClaimsPrincipal principal) { var newPrincipal = await base.CreateAsync(principal); // 确保OID声明被保留并映射到常用标识类型 var oidClaim = newPrincipal.FindFirst("oid"); if (oidClaim != null && newPrincipal.Claims.All(c => c.Type != ClaimTypes.NameIdentifier)) { ((ClaimsIdentity)newPrincipal.Identity).AddClaim(new Claim(ClaimTypes.NameIdentifier, oidClaim.Value)); } return newPrincipal; } } - 检查Microsoft.Identity.Web配置:确认appsettings.json中的AzureAdB2C配置完整,
ClientId、Domain、SignUpSignInPolicyId等参数正确,没有额外的声明过滤规则。
内容的提问来源于stack exchange,提问作者user365462
相关产品推荐
相关产品推荐

