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

为何客户端存在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:57:08