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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:57:13