Microsoft Identity Platform多租户应用限制指定租户访问方案咨询
关于多租户Azure AD应用租户准入控制的方案解答
一、Azure门户原生配置说明
你没有遗漏配置项:多租户应用本身在Azure AD门户中没有内置的租户黑白名单开关,微软的设计逻辑就是多租户应用默认开放所有Azure AD租户和个人微软账号访问,准入控制交给应用侧自行实现,符合OAuth2.0的基本设计规范。
二、现有方案的合理性与疏漏点
现有方案的合理性
你提出的服务端校验租户ID白名单的思路是行业通用实现,逻辑本身没有问题,完全适配初期手动开通的业务场景。
需注意的疏漏点
- 校验时机不能只放在页面跳转前后,必须在所有受保护接口的请求链路中也加入校验,避免用户直接调用接口绕过前端页面校验
- 不要从前端传递的用户信息中取租户ID做校验,必须从服务端解析ID Token/Access Token的
tid声明取值,防止前端篡改 - 租户ID要和企业的订阅信息绑定存储,避免录入错误的租户ID导致授权错误
三、可复用的实现参考
你可以直接复用Microsoft Identity Platform自带的令牌校验扩展逻辑:
- 在身份验证中间件配置中添加自定义的
OnTokenValidated事件 - 事件中直接从令牌Claims里获取
tid(租户ID)值 - 调用数据库查询该租户ID是否在白名单内
- 不在白名单内直接抛出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
相关产品推荐
相关产品推荐

