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

技术问询:如何列出本人为成员或访客的所有Azure Active Directory

刚好我之前做过多租户应用的租户切换功能,对这个需求门儿清,给你整理一套完整的实现方案:

一、获取所有可访问的租户(成员+访客)

不用分开调用ARM API和其他接口,Microsoft Graph的/me/availableTenants端点可以一次性返回你能访问的所有租户——不管是作为正式成员加入的,还是以访客身份受邀的。这个端点简直是为多租户应用的租户切换量身定做的!

调用方式:

  • 需要的权限:Delegated类型的User.Read(普通用户权限就能访问,不需要管理员同意)
  • 请求示例(REST):
GET https://graph.microsoft.com/v1.0/me/availableTenants
Authorization: Bearer {access-token}
  • 返回结果里,每个租户条目会包含tenantId、displayName,还有关键的tenantCategory字段——这个字段直接告诉你是Member(成员租户)还是Guest(访客租户),完美区分两种身份!

代码示例(MSAL.js + Fetch):

const msalConfig = {
  auth: {
    clientId: "你的应用客户端ID",
    authority: "https://login.microsoftonline.com/common" // 多租户模式
  }
};
const msalInstance = new msal.PublicClientApplication(msalConfig);

// 获取所有可访问租户
async function fetchAvailableTenants() {
  try {
    // 先获取Graph API的访问令牌
    const tokenResult = await msalInstance.acquireTokenSilent({
      scopes: ["User.Read"]
    });
    
    // 调用Graph API获取租户列表
    const response = await fetch("https://graph.microsoft.com/v1.0/me/availableTenants", {
      headers: {
        "Authorization": `Bearer ${tokenResult.accessToken}`
      }
    });
    
    if (!response.ok) throw new Error("获取租户列表失败");
    return await response.json();
  } catch (err) {
    console.error(err);
    // 如果静默获取令牌失败,触发交互式登录
    await msalInstance.acquireTokenPopup({ scopes: ["User.Read"] });
    return fetchAvailableTenants(); // 重试
  }
}
二、如果需要单独获取成员租户(用ARM API)

如果你还是需要单独获取作为成员的租户,就用你提到的Azure Resource Manager API的Tenants - List接口:

  • 请求示例:
GET https://management.azure.com/tenants?api-version=2021-05-01
Authorization: Bearer {arm-access-token}
  • 注意:这个API需要的权限是Directory.Read.All或者User.Read(Delegated类型),而且返回的只有你作为成员的租户,不包含访客租户。
三、实现类似Azure门户的租户切换UI

UI设计可以参考Azure门户的风格:

  1. 下拉菜单:在应用顶部导航栏放一个租户选择器,显示当前租户的名称和logo,点击展开所有可访问的租户列表。
  2. 租户信息展示:每个列表项显示租户名称、logo(可以通过Graph API的/organization/{tenantId}/branding/logo获取),以及身份类型(成员/访客)。
  3. 切换逻辑:当用户选择某个租户时,用MSAL库切换认证的authority到对应租户,重新获取该租户的访问令牌:
// 切换租户的函数
async function switchToTenant(tenantId) {
  try {
    // 切换到指定租户的授权端点
    await msalInstance.acquireTokenRedirect({
      scopes: ["你的应用需要的权限"],
      authority: `https://login.microsoftonline.com/${tenantId}`
    });
    // 令牌获取成功后,刷新应用状态,加载对应租户的数据
    window.location.reload();
  } catch (err) {
    console.error("切换租户失败:", err);
  }
}
四、关键注意事项
  • 应用注册设置:确保你的应用注册是多租户模式——在Azure AD应用注册页面,把「支持的账户类型」设为「任何组织目录中的账户」(如果需要支持个人微软账户可以选对应选项)。
  • 权限配置:除了User.Read,还要根据你的应用需求添加对应的API权限,比如如果需要访问租户内的资源,可能需要Directory.Read.All等,记得要授予管理员同意(如果是企业级应用)。
  • 缓存优化:租户列表不会频繁变动,可以把获取到的租户信息缓存到localStorage或者会话存储里,比如缓存24小时,减少API调用次数,提升用户体验。
  • 错误处理:要处理令牌过期、权限不足、网络错误等情况,给用户友好的提示,比如“无法获取租户列表,请重新登录”。

内容的提问来源于stack exchange,提问作者Joar Øyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:49:58