使用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权限配置截图:
问题原因及解决步骤
核心原因
Tenant A的服务主体(你用的Client ID)没有在Tenant B的Dynamics 365组织中完成合法主体的关联与权限分配,跨租户服务主体必须走完「邀请入驻+权限配置+组织绑定」流程才能正常访问。
具体操作步骤
在Tenant B中添加并邀请Tenant A的服务主体
- 登录Tenant B的Azure门户,进入「Azure Active Directory」→「企业应用程序」→「所有应用程序」,搜索Tenant A的服务主体ID。如果搜不到,就通过「新建应用注册」→「注册现有应用程序(跨租户)」,输入Tenant A应用的客户端ID完成添加。
- 或者直接在Azure AD的「用户」→「新建用户」→「邀请外部用户」,填入服务主体的应用ID(UUID格式)完成邀请。
给服务主体分配Dynamics 365安全角色
- 登录Tenant B的Dynamics 365,进入「高级设置」→「安全」→「用户」,切换到「应用用户」视图,找到刚添加的Tenant A服务主体。
- 为其分配对应安全角色(比如先给「系统管理员」测试,后续按需调整)。
验证访问令牌的有效性
- 拿到令牌后用JWT解码工具检查:
tid是否是Tenant B的租户ID,oid是否为Tenant A服务主体的对象ID,同时确认roles或scp声明包含Dynamics 365的相关权限。
- 拿到令牌后用JWT解码工具检查:
确认API权限的管理员同意状态
- 从截图看你已经在Tenant A的应用中添加了Tenant B的Dynamics API权限,但要确保这些权限已经获得管理员同意(如果截图中没有显示「已授予」,需要Tenant A的管理员操作同意)。
额外提醒
- 跨租户客户端凭证流的scope格式
https://<org-url>/.default是正确的,你的代码这部分没问题。 - 检查Tenant B的Dynamics 365组织设置:「安全」→「外部应用访问设置」,确保允许外部服务主体访问。
内容的提问来源于stack exchange,提问作者Mayank Kushwaha
相关产品推荐
相关产品推荐

