使用.NET 5调用受Azure B2C保护的Web API时访问令牌版本不匹配问题
Azure B2C访问令牌版本不匹配问题修复方案
核心错误纠正
你之前的配置修改方向完全相反:要获取2.0版本的访问令牌,需要将Web API应用清单的accessTokenAcceptedVersion参数设置为2,而非1。
注意:B2C应用清单修改存在10~15分钟的生效延迟,修改后不要立刻测试,避免误判配置是否生效,必要时可重新发布对应用户流/自定义策略强制刷新配置。
上下游配置校验
前端Web应用配置检查
- 配置文件中
AzureAdB2C节点的Authority地址必须带/v2.0后缀,格式参考:https://{你的B2C租户名}.b2clogin.com/{你的B2C租户名}.onmicrosoft.com/{用户流名称}/v2.0
未加v2.0后缀时,B2C默认走1.0认证端点,返回的所有令牌都是1.0版本。 - 申请令牌时传入的
Scopes必须使用B2C API的完整权限格式,参考:https://{你的B2C租户名}.onmicrosoft.com/{API应用的客户端ID}/{自定义权限名}
不要使用短格式scope、或者Graph相关的默认scope,否则B2C会返回1.0版本令牌。
你现有获取令牌的代码无需修改:
string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(Scopes);
下游Web API配置检查
- 配置文件中
AzureAd节点的Authority地址同样要带/v2.0后缀,和Web应用的租户、用户流配置保持一致。 - 可以在注册认证服务时显式指定令牌校验规则,避免版本兼容问题:
services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd", o => { o.TokenValidationParameters.ValidIssuer = $"https://{Configuration["AzureAd:Domain"]}/{Configuration["AzureAd:TenantId"]}/v2.0/"; });
验证方法
拿到访问令牌后,粘贴到JWT解析工具中查看两个字段:
ver字段值为2.0代表令牌版本正确iss字段带/v2.0后缀代表是从2.0端点签发的令牌
内容的提问来源于stack exchange,提问作者Rene Tomlinson
相关产品推荐
相关产品推荐

