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

如何让Azure多租户应用在ID Token中返回自定义Claims?

问题:多租户场景下获取自定义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携带自定义字段,改为在应用逻辑中处理:

    1. 用户登录后,通过Microsoft Graph API获取用户基础信息
    2. 根据业务规则生成account、userId等自定义字段
    3. 自行签发包含这些自定义Claims的应用级JWT令牌,供后续业务流程使用
  • 多租户应用+自定义令牌策略(仅Azure AD租户用户)

    1. 将应用注册设置为多租户模式,允许其他Azure AD租户用户登录
    2. 创建自定义令牌颁发策略,针对所有访问该应用的Azure AD用户(含外部租户)注入自定义Claims
      注意:此方案无法覆盖个人微软账户(MSA),因为MSA用户不属于任何Azure AD租户,无法应用你的租户策略
  • Azure AD B2C(推荐含个人微软账户的场景)
    若需要同时支持个人微软账户和多租户Azure AD用户,建议迁移到Azure AD B2C:

    1. 在B2C中配置自定义用户流或自定义策略
    2. 直接在令牌生成逻辑中添加自定义Claims,无论用户来自外部租户还是个人微软账户

总结

  • 若需覆盖所有Azure AD租户用户+个人微软账户,最可行的方案是在应用层自行生成含自定义Claims的令牌,或迁移到Azure AD B2C。
  • 若仅需支持Azure AD多租户用户,可通过自定义令牌颁发策略实现,但无法覆盖个人微软账户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:12:25