使用Microsoft.Identity.Web的OBO流程调用下游API时401无效受众故障
故障排查与解决方法
核心问题分析
错误提示The audience 'api2' is invalid说明:api1获取的访问api2的token中,aud(受众)字段值为api2,但api2的身份验证逻辑期望的是其正确的标识符(通常是api://<api2-client-id>或者api2的客户端ID,取决于api2的Azure AD配置)。
具体排查与修复步骤
1. 修正api1的appsettings.json配置
当前api1的api2配置存在两处错误:
BaseUrl未使用api2的完整标识符格式Scopes未包含api2的标识符前缀
修改后的配置示例:
{ "api2": { "BaseUrl": "api://your-api2-client-id", // 替换为api2的实际客户端ID,保留api://前缀 "Scopes": "api://your-api2-client-id/FunctionB" // 完整作用域格式:api2标识符/权限名 } }
2. 修正api1控制器中的作用域拼接逻辑
当前代码中_scopes = configuration["api2:Scopes"].Split(' ').Select(x => $"{_instanceURL}/{x}");是错误的,作用域无需拼接Azure AD实例地址(login.microsoftonline.com)。
修改为直接读取配置中的完整作用域:
_scopes = configuration["api2:Scopes"].Split(' ');
如果配置中仅填写了权限名(如FunctionB),则需要拼接api2的标识符:
var api2BaseUrl = configuration["api2:BaseUrl"]; _scopes = configuration["api2:Scopes"].Split(' ').Select(x => $"{api2BaseUrl}/{x}");
3. 验证api2的Azure AD配置
- 进入api2的Azure AD应用注册,检查公开API中的
应用ID URI,该值就是api2的受众标识符,token的aud字段必须与它完全匹配(通常格式为api://<client-id>)。 - 确认api2的API权限中已添加api1的
FunctionB应用权限,且完成了管理员同意。
4. 验证token的受众是否正确
解析api1获取的accessToken1,查看aud字段值是否与api2的应用ID URI一致。如果不匹配,说明作用域配置错误,需重新调整。
5. 简化下游API调用方式
使用AddDownstreamApi配置后,无需手动设置BaseUrl和Scopes,直接调用即可自动读取配置:
var testresponse = await _downstreamApi.CallApiForUserAsync( "api2", options => { options.RelativePath = "weatherforecast"; options.HttpMethod = HttpMethod.Get; } );
额外注意事项
- 确保WebApp1获取的token是针对api1的
FunctionA权限,api1只有接收到有效用户token后,才能触发OBO流程获取api2的token。 - 本地调试时,确保三个服务的端口配置正确,且HTTPS证书有效,避免因证书问题导致请求失败。
内容的提问来源于stack exchange,提问作者Coden00b
相关产品推荐
相关产品推荐

