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

Microsoft Identity Platform多租户应用限制指定租户访问方案咨询

关于多租户Azure AD应用租户准入控制的方案解答

一、Azure门户原生配置说明

你没有遗漏配置项:多租户应用本身在Azure AD门户中没有内置的租户黑白名单开关,微软的设计逻辑就是多租户应用默认开放所有Azure AD租户和个人微软账号访问,准入控制交给应用侧自行实现,符合OAuth2.0的基本设计规范。

二、现有方案的合理性与疏漏点

现有方案的合理性

你提出的服务端校验租户ID白名单的思路是行业通用实现,逻辑本身没有问题,完全适配初期手动开通的业务场景。

需注意的疏漏点

  • 校验时机不能只放在页面跳转前后,必须在所有受保护接口的请求链路中也加入校验,避免用户直接调用接口绕过前端页面校验
  • 不要从前端传递的用户信息中取租户ID做校验,必须从服务端解析ID Token/Access Token的tid声明取值,防止前端篡改
  • 租户ID要和企业的订阅信息绑定存储,避免录入错误的租户ID导致授权错误

三、可复用的实现参考

你可以直接复用Microsoft Identity Platform自带的令牌校验扩展逻辑:

  1. 在身份验证中间件配置中添加自定义的OnTokenValidated事件
  2. 事件中直接从令牌Claims里获取tid(租户ID)值
  3. 调用数据库查询该租户ID是否在白名单内
  4. 不在白名单内直接抛出403权限错误,中间件会自动跳转至无权访问页

ASP.NET Core场景示例代码:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches()
    .AddOpenIdConnect(options =>
    {
        options.Events.OnTokenValidated = async context =>
        {
            // 从令牌中取不可篡改的租户ID
            var tenantId = context.Principal.FindFirstValue("tid");
            var tenantService = context.HttpContext.RequestServices.GetRequiredService<ITenantService>();
            // 校验租户是否在白名单
            var isAllowed = await tenantService.CheckTenantAllowedAsync(tenantId);
            if (!isAllowed)
            {
                context.Fail("Tenant not authorized");
                context.Response.Redirect("/Unauthorized");
            }
        };
    });

四、扩展优化建议

如果后续业务规模扩大,可以支持用户自助开通:

  • 增加租户管理员的自助授权流程,引导对方完成订阅支付后自动录入租户ID到白名单
  • 可以配合Azure AD的租户限制策略,针对使用你应用的企业租户侧也做访问限制,进一步提升安全性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:36:02