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

使用organizations令牌调用多租户Web API时Azure AD认证失败

问题解决:多租户API使用organizations端点的错误修复及租户限制配置

错误原因分析

你遇到的AADSTS90002: Tenant 'organizations' not found错误,是因为Web API直接将Authority设为https://login.microsoftonline.com/organizations时,AAD无法识别organizations作为有效租户ID。organizations是一个逻辑占位符,用于表示"任意企业租户",但不能直接用来请求OpenID配置元数据。正确的做法是让API根据令牌中的实际颁发者(Issuer)动态获取对应租户的元数据,而Microsoft.Identity.Web已经封装了这个逻辑,无需手动配置JwtBearer。

解决方案步骤

1. 修复Web API的认证配置

首先,确保Web API安装了Microsoft.Identity.Web NuGet包,然后替换手动的JwtBearer配置为官方封装的方法:

服务配置代码

services.AddMicrosoftIdentityWebApiAuthentication(Configuration);

对应的appsettings.json配置

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "TenantId": "organizations",
  "Audience": "https://companyname.com/webapi" // 这里填你的API应用ID URI或ClientId
}

这个配置会让Microsoft.Identity.Web自动处理多租户场景:它会从传入的JWT令牌中提取Issuer(格式为https://login.microsoftonline.com/{tenant-id}/v2.0),然后动态获取该租户的OpenID配置元数据,避免直接请求organizations端点导致的400错误。

2. 配置多租户支持并限制特定租户

现在API已经支持多租户,你可以通过以下两种方式限制仅允许指定租户访问:

方式一:静态配置允许的租户列表

直接在TokenValidationParameters中指定有效Issuer(每个租户的Issuer格式为https://login.microsoftonline.com/{tenant-id}/v2.0):

services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters.ValidateIssuer = true;
        options.TokenValidationParameters.ValidIssuers = new List<string>
        {
            "https://login.microsoftonline.com/你的租户ID1/v2.0",
            "https://login.microsoftonline.com/你的租户ID2/v2.0"
        };
    });

方式二:动态验证租户(适合从数据库/配置中心读取允许列表)

使用IssuerValidator委托自定义验证逻辑,比如从数据库查询允许的租户ID:

services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters.ValidateIssuer = true;
        options.TokenValidationParameters.IssuerValidator = (issuer, token, parameters) =>
        {
            // 从Issuer URL中提取租户ID(格式:https://login.microsoftonline.com/{tenant-id}/v2.0)
            var tenantId = issuer.Split('/')[3];
            
            // 这里替换为你的租户验证逻辑,比如从数据库读取允许的租户列表
            var allowedTenantIds = new List<string> { "租户ID1", "租户ID2" };
            
            if (allowedTenantIds.Contains(tenantId))
            {
                return issuer; // 验证通过,返回原始Issuer
            }
            
            throw new SecurityTokenInvalidIssuerException("当前租户未被授权访问");
        };
    });

3. 确保Web应用禁止个人账号登录

在Web应用的Azure AD应用注册中,设置支持的账户类型为「任何组织目录中的账户(任何 Azure AD 目录 - 多租户)」,这样个人Microsoft账号(@outlook.com、@hotmail.com等)将无法登录,符合你使用organizations而非common的需求。

验证流程

  1. Web应用使用organizations租户ID发起登录,仅企业账号能成功登录
  2. Web应用获取API的访问令牌(令牌中的Issuer为对应企业租户的URL)
  3. API接收到令牌后,动态获取该租户的元数据并验证令牌有效性
  4. 若租户在允许列表中,则允许访问;否则拒绝

内容的提问来源于stack exchange,提问作者S. ten Brinke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:52:49