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

AAD多API环境下OnBehalfOf模式单点令牌请求方案咨询

解决方案:优化令牌请求流程,仅需一次前端请求

不需要请求三个独立令牌,通过以下方式可以将前端的令牌请求减少到一次,同时满足所有场景需求:

1. 前端侧:一次请求获取多API权限令牌

  • 在AAD中给你的Angular应用注册同时添加MyApi1和MyApi2的委托权限(确保已获得管理员同意)
  • 使用MSAL Angular(@azure/msal-angular)发起令牌请求时,将两个API的scope合并到同一个请求中,示例代码:
    const loginRequest = {
      scopes: ["api://MyApi1/access_scope", "api://MyApi2/access_scope"]
    };
    this.msalService.loginPopup(loginRequest);
    
  • 这样前端就能一次性拿到同时具备访问MyApi1和MyApi2权限的访问令牌,后续调用两个API时直接使用该令牌即可

2. MyApi1侧:通过OBO模式获取SharePoint令牌(无需前端介入)

  • 前端调用MyApi1时,将上述拿到的访问令牌作为Authorization头的Bearer令牌传入
  • 在MyApi1中,借助PnP Library的OBO功能,用前端传来的令牌向AAD请求SharePoint Online的访问令牌:
    • 确保MyApi1的AAD注册已添加SharePoint Online的委托权限(例如Sites.Read.All)并获得管理员同意
    • PnP的OBO实现会自动完成令牌交换流程,代码示例(简化版):
      var oboToken = await new OnBehalfOfTokenProvider().GetTokenAsync("https://contoso.sharepoint.com/.default", request.Headers.Authorization.Parameter);
      var context = new PnPContext(new Uri("https://contoso.sharepoint.com/sites/MySite"), new TokenAuthenticationProvider(() => Task.FromResult(oboToken)));
      
  • 这个过程完全在后端完成,前端不需要直接请求SharePoint的令牌

关键注意事项

  • 所有涉及的权限必须是委托权限,因为整个流程是代表已认证的前端用户操作
  • 确保MyApi1的AAD注册已启用“允许跨域访问”(如果前端和MyApi1不在同一域),并且配置了正确的回复URL
  • 前端MSAL配置的authority必须指向正确的AAD租户,确保能正确获取多scope的令牌

内容的提问来源于stack exchange,提问作者GioP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:06:02