从IdentityServer4迁移至Azure AD:能否配置单实例多租户并支持acr_values参数?
问题
我们目前使用定制化的IdentityServer 4,基于OpenID Connect(OIDC)规范实现了多租户功能,该规范包含acr_values查询参数。在重定向到身份提供商时,我们会在URL中传入&acr_values=tenant:acme作为查询参数。现在计划从IdentityServer 4迁移至Azure Active Directory(AAD),请问能否配置单个AAD实例实现多租户,并使用带有tenant键的acr_values查询参数?
解答
单个AAD实例实现多租户的可行性
完全可以通过单个AAD实例实现业务多租户,但AAD的多租户实现逻辑和IdentityServer4存在差异:
- 若你需要在单个AAD实例内管理多个业务租户(比如
acme这类自定义租户),可通过以下方式实现租户隔离与标识:- 为每个业务租户创建专属安全组,将所属用户加入对应组,以此区分租户;
- 为用户或应用添加自定义扩展属性,存储租户标识(如
tenantName或tenantId); - 利用AAD的条件访问策略、自定义角色,针对不同租户配置差异化的权限与访问规则。
- 若你指的是允许外部AAD租户的用户登录你的应用,AAD原生支持多租户应用注册,只需将应用配置为接受"任何组织目录中的账户"即可,但这和你原有的业务租户模型逻辑不同,需根据实际需求选择。
acr_values参数的支持情况
AAD支持OIDC规范中的acr_values参数,但对tenant:acme这类自定义键值对的处理有局限:
- AAD的
acr_values主要用于指定身份验证上下文,比如强制MFA(acr_values=urn:microsoft:reqauth:mf)、指定登录方式(acr_values=usernamepassword)等,原生不会识别并处理tenant这类自定义键; - 若要传递租户信息,更推荐使用AAD原生支持的方式:
state参数:将租户信息加密后存入state,AAD会在回调时原样返回该参数,你可在回调逻辑中解析获取;domain_hint参数:如果每个业务租户对应AAD中的一个自定义域名,可使用domain_hint=acme.com引导用户进入对应租户的登录页;- 自定义查询参数:在AAD应用注册中配置允许的额外参数后,可直接传递
&tenant=acme这类自定义参数,AAD会在回调时返回;
- 若坚持要通过
acr_values传递租户信息,需借助AAD的自定义策略(如Azure AD B2C自定义策略或AAD身份验证流程扩展)添加解析逻辑,将acr_values中的tenant键映射到租户标识,但这需要额外的开发与配置成本,不如原生方式高效。
总结
- 单个AAD实例可实现业务多租户,通过安全组、自定义属性或域等方式区分租户;
- AAD不原生支持
acr_values=tenant:acme这类自定义键值对,建议改用state、domain_hint或自定义查询参数传递租户信息,若需使用acr_values则需通过自定义策略扩展实现。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

