通过Azure APIM传递用户AD令牌至Dynamics Web API遇401未授权问题
解决Azure APIM传递用户令牌到Dynamics Web API的401未授权问题
核心问题分析
你直接转发用户的front-end-client令牌到Dynamics Web API时出现401,本质原因是令牌受众(aud字段)不匹配:用户传入的令牌受众是front-end-client的Client ID,而Dynamics Web API只接受针对自身资源(或授权代理应用)的令牌。
正确解决方案:使用OBO(On-Behalf-Of)流程获取用户委托令牌
需在APIM中先验证用户令牌,再通过OBO流程获取针对Dynamics Web API的用户身份令牌,最后将该令牌传递给后端。
前置检查
- 确保
front-end-client应用注册已添加Dynamics Web API的Delegated权限(如user_impersonation),且管理员已完成权限同意。 - 准备以下信息:
- 租户ID
front-end-client的Client ID和Client Secret(需在APIM中添加为命名值,避免明文暴露)- Dynamics Web API的资源URI(格式:
https://<你的组织名称>.crm.dynamics.com)
APIM策略配置示例
<policies> <inbound> <!-- 1. 验证前端传入的用户令牌,验证通过后存入变量 --> <validate-azure-ad-token tenant-id="你的租户ID" audience="front-end-client的Client ID" output-token-variable-name="validatedUserToken" /> <!-- 2. 通过OBO流程获取针对Dynamics的用户委托令牌 --> <oauth2-acquire-token-on-behalf-of resource="https://你的Dynamics组织URL.crm.dynamics.com" client-id="front-end-client的Client ID" client-secret="{{front-end-client-secret}}" <!-- APIM命名值,存储Client Secret --> assertion="@(context.Variables.GetValueOrDefault<string>("validatedUserToken"))" output-token-variable-name="dynamicsUserToken" /> <!-- 3. 将新令牌设置到后端请求的Authorization头 --> <set-header name="Authorization" exists-action="override"> <value>@("Bearer " + context.Variables.GetValueOrDefault<string>("dynamicsUserToken"))</value> </set-header> <base /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
关键验证步骤
- 用
jwt.ms解码dynamicsUserToken,确认aud字段为Dynamics Web API的资源URI,sub字段为目标用户ID。 - 检查APIM网络配置,确保能访问Azure AD令牌端点(
https://login.microsoftonline.com)。 - 确认用户账号本身拥有Dynamics Web API的查询权限(已验证权限可跳过)。
内容的提问来源于stack exchange,提问作者GT.
相关产品推荐
相关产品推荐

