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

多租户应用无法获取客户租户Azure AD用户问题排查

问题分析与解决方案

你的问题核心不是单纯缺少权限,而是Graph API调用的租户上下文错误,再结合权限配置的问题,导致只能获取到application-tenant的用户。具体原因和解决方法如下:

1. 租户上下文错误是直接原因

你的应用虽然启用了多租户登录,但如果调用Graph API时,仍然使用application-tenant的租户ID作为请求目标,Graph API只会返回该租户下的用户数据。

当xyz@customer-tenant.com用户登录后,你的应用应该切换到customer-tenant的租户上下文去调用Graph API——也就是用customer-tenant的租户ID来构建Graph请求,而不是硬编码自己的application-tenant ID。

2. 权限配置需满足目标租户的要求

即使租户上下文正确,还需要确保:

  • 你的多租户应用在customer-tenant中已被授予访问用户数据的权限(比如User.Read.All、Directory.Read.All等),且必须是customer-tenant的管理员完成了权限同意。因为免费租户的应用要访问付费租户的企业数据,必须得到目标租户的授权。
  • 应用注册时申请的权限范围要匹配你的需求(比如要读取所有用户就不能只申请User.Read)。

3. .NET代码层面的修正示例

在调用Graph API时,要基于用户登录后的身份信息动态获取租户ID,而不是固定使用application-tenant的ID:

// 从用户的ClaimsPrincipal中获取登录的租户ID
var tenantId = User.FindFirstValue("http://schemas.microsoft.com/identity/claims/tenantid");

// 使用该租户ID构建GraphServiceClient
var graphClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(async (requestMessage) =>
    {
        // 获取用户的访问令牌(注意要包含Graph API的权限范围)
        var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new[] { "User.Read.All" });
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
    }),
    new GraphServiceClientOptions { TenantId = tenantId }
);

// 此时调用用户列表,会返回customer-tenant的用户
var users = await graphClient.Users.Request().GetAsync();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:10:37