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

使用Web API连接Dynamics 365两租户报错:用户不属于组织

跨Azure租户调用Dynamics 365 Web API报错:用户不属于该组织

问题详情

我正尝试用Tenant A的客户端ID和密钥调用Tenant B的Dynamics 365 Web API,按步骤操作时,请求令牌使用Tenant B的租户ID及Web API的scope。

Tenant B的Web API端点:https://org8885b353.api.crm.dynamics.com/

获取访问令牌的代码:

$response = $this->client->post("https://login.microsoftonline.com/{tenantB_id}/oauth2/v2.0/token", [
    'timeout' => 30,
    'form_params' => [
        'client_id' => 'tenantA_clientId',
        'client_secret' => 'tenantA_clientSecret',
        'scope' => 'https://org8885b353.api.crm.dynamics.com/.default',
        'grant_type' => 'client_credentials',
    ],
]);

使用返回的令牌调用https://org8885b353.api.crm.dynamics.com/api/data/v9.2获取实体列表时,触发错误:

{
    "error": {
        "code": "0x80072560",
        "message": "The user is not a member of the organization."
    }
}

API权限配置截图:
API权限配置截图


问题原因及解决步骤

核心原因

Tenant A的服务主体(你用的Client ID)没有在Tenant B的Dynamics 365组织中完成合法主体的关联与权限分配,跨租户服务主体必须走完「邀请入驻+权限配置+组织绑定」流程才能正常访问。

具体操作步骤

  1. 在Tenant B中添加并邀请Tenant A的服务主体

    • 登录Tenant B的Azure门户,进入「Azure Active Directory」→「企业应用程序」→「所有应用程序」,搜索Tenant A的服务主体ID。如果搜不到,就通过「新建应用注册」→「注册现有应用程序(跨租户)」,输入Tenant A应用的客户端ID完成添加。
    • 或者直接在Azure AD的「用户」→「新建用户」→「邀请外部用户」,填入服务主体的应用ID(UUID格式)完成邀请。
  2. 给服务主体分配Dynamics 365安全角色

    • 登录Tenant B的Dynamics 365,进入「高级设置」→「安全」→「用户」,切换到「应用用户」视图,找到刚添加的Tenant A服务主体。
    • 为其分配对应安全角色(比如先给「系统管理员」测试,后续按需调整)。
  3. 验证访问令牌的有效性

    • 拿到令牌后用JWT解码工具检查:tid是否是Tenant B的租户ID,oid是否为Tenant A服务主体的对象ID,同时确认roles或scp声明包含Dynamics 365的相关权限。
  4. 确认API权限的管理员同意状态

    • 从截图看你已经在Tenant A的应用中添加了Tenant B的Dynamics API权限,但要确保这些权限已经获得管理员同意(如果截图中没有显示「已授予」,需要Tenant A的管理员操作同意)。

额外提醒

  • 跨租户客户端凭证流的scope格式https://<org-url>/.default是正确的,你的代码这部分没问题。
  • 检查Tenant B的Dynamics 365组织设置:「安全」→「外部应用访问设置」,确保允许外部服务主体访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:26:17