如何让Azure多租户应用在ID Token中返回自定义Claims?
我正在使用msal-node客户端,尝试获取任意租户(非仅自身Azure租户)账户的自定义Claims。当使用指定租户ID的authority(https://login.microsoftonline.com/f7a9.... (tenant id)/oauth2/v2.0/)登录自身租户账户时,能在ID Token中获取到account和userId两个自定义Claims,相关代码及Token示例如下:
代码示例
const msalApp = new ConfidentialClientApplication({ auth: { clientId: '7eb... (app registration id)', authority: 'https://login.microsoftonline.com/f7a9... (tenant id)/oauth2/v2.0/', clientSecret: env.AZURE_CLIENT_SECRET, }, }) // ....... 重定向到微软登录页 const authCodeUrl = await msalApp.getAuthCodeUrl({ scopes: ["openid"], redirectUri: env.AUTH_REDIRECT_URL!, }) throw redirect(303, authCodeUrl) // ....... 回调代码处理: const code = event.url.searchParams.get('code') const tokenRequest = { code, scopes: ["openid"], redirectUri: env.AUTH_REDIRECT_URL!, } const authenticationResult = await msalApp.acquireTokenByCode(tokenRequest) console.log(authenticationResult)
ID Token示例
idTokenClaims: { aud: '7eb....', iss: 'https://login.microsoftonline.com/f7a9.../v2.0', iat: 1716458530, nbf: 1716458530, exp: 1716462430, aio: 'AaQAW...', idp: 'https://sts.windows.net/9188040d.../', name: '...', oid: '...', preferred_username: '...', rh: '...', sub: '...', tid: '...', uti: '...', ver: '2.0', account: 'Test Account', userId: '1' },
但此时无法使用其他租户账户登录;若切换为common authority(https://login.microsoftonline.com/common/oauth2/v2.0/)则支持多租户登录,但ID Token中不再包含自定义Claims。
我已按微软官方指南配置了自定义Claims提供程序,当前应用配置如图所示。请问如何创建既支持任意租户/个人微软账户登录,又能返回自定义Claims的Azure应用注册?是否可行?
解答
核心原因
自定义Claims提供程序(如Azure AD的Claims映射或自定义令牌颁发策略)默认仅对自身租户内的用户生效。当使用common authority时,外部租户/个人微软账户的令牌由其所属IDP颁发,你的租户的自定义Claims配置无法影响这些外部令牌的内容。
可行方案
要实现多租户+自定义Claims的需求,需调整方案:
应用层自定义Claims(全场景覆盖)
放弃依赖Azure AD的ID Token携带自定义字段,改为在应用逻辑中处理:- 用户登录后,通过Microsoft Graph API获取用户基础信息
- 根据业务规则生成
account、userId等自定义字段 - 自行签发包含这些自定义Claims的应用级JWT令牌,供后续业务流程使用
多租户应用+自定义令牌策略(仅Azure AD租户用户)
- 将应用注册设置为多租户模式,允许其他Azure AD租户用户登录
- 创建自定义令牌颁发策略,针对所有访问该应用的Azure AD用户(含外部租户)注入自定义Claims
注意:此方案无法覆盖个人微软账户(MSA),因为MSA用户不属于任何Azure AD租户,无法应用你的租户策略
Azure AD B2C(推荐含个人微软账户的场景)
若需要同时支持个人微软账户和多租户Azure AD用户,建议迁移到Azure AD B2C:- 在B2C中配置自定义用户流或自定义策略
- 直接在令牌生成逻辑中添加自定义Claims,无论用户来自外部租户还是个人微软账户
总结
- 若需覆盖所有Azure AD租户用户+个人微软账户,最可行的方案是在应用层自行生成含自定义Claims的令牌,或迁移到Azure AD B2C。
- 若仅需支持Azure AD多租户用户,可通过自定义令牌颁发策略实现,但无法覆盖个人微软账户。
内容的提问来源于stack exchange,提问作者Matt

