.NET Core 3.1下Azure AD B2C的OBO流报AADST50013错误如何解决
排查AADSTS50013错误的可行方案
该错误核心是OBO请求中传入的用户断言(即前端传递给Web API 1的访问令牌)签名无法被Azure AD B2C验证,找不到对应签名公钥,可按以下顺序排查:
- 首先修正Startup.cs的TokenValidationParameters配置:你当前直接new了一个TokenValidationParameters实例,覆盖了AddMicrosoftIdentityWebApi默认注入的B2C专属验证参数,会导致默认的发行人、受众验证规则失效,正确写法是直接修改现有参数:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { Configuration.Bind("AzureAdB2C", options); // 不要new新的参数实例,直接修改现有实例的SaveSigninToken属性 options.TokenValidationParameters.SaveSigninToken = true; }, options => { Configuration.Bind("AzureAdB2C", options); });
- 检查构造ConfidentialClientApplication时的授权地址(authority)是否符合B2C规范:B2C的OBO流授权地址必须携带用户流/自定义策略名称,格式为
https://<你的B2C租户域名>.b2clogin.com/<你的B2C租户域名>.onmicrosoft.com/<你使用的用户流名称>/v2.0/,不能使用普通Azure AD不带策略的授权地址,B2C的签名密钥和策略绑定,用错策略会找不到对应公钥。 - 确认MSAL配置开启了B2C适配:构造ConfidentialClientApplication时要使用
.WithB2CAuthority(authority)替代普通的.WithAuthority(authority),避免MSAL去普通Azure AD的公钥端点拉取密钥。 - 验证传入的用户断言有效性:将
bootstrapContext输出后粘贴到JWT解析工具中校验以下字段:aud字段必须是Web API 1的客户端ID或应用ID URIiss字段必须和你构造的authority对应的发行人地址完全一致- 令牌没有过期
- 检查申请的scope格式是否正确:OBO流请求的scope必须是Web API 2暴露的完整scope路径,格式为
https://<你的B2C租户域名>.onmicrosoft.com/<Web API 2的应用ID>/<scope名称>,不能直接使用短名称。 - 检查Web API 1的应用注册清单配置:确认
accessTokenAcceptedVersion属性设置为2,和B2C v2端点签发的令牌版本匹配。
内容的提问来源于stack exchange,提问作者MikePR
相关产品推荐
相关产品推荐

