我有一个“多租户和个人”Entra 应用程序,应该允许拥有各种 Microsoft 帐户的用户登录它。
我需要向此应用程序返回的 ID 令牌添加一些自定义声明(特别是
user.jobtitle
和 user.officelocation
声明)。我通过在 Microsoft Entra 管理中心为相关应用程序添加“附加声明”来完成此操作,详情请参阅此处。配置看起来像这样:
由于这是一个多租户应用程序,我必须按照此处的详细信息配置自定义签名密钥。我已经使用 Microsoft 提供的 Powershell 脚本完成了此操作。
完成这些配置后,我现在可以获得 OIDC ID 令牌。但是,有一个很大的限制。
ID 令牌仅包含应用程序所在同一租户中的用户的新自定义声明。即,如果应用程序位于租户
aaaa-....-aaaa
中,并且我使用租户 aaaa-...-aaaa
中的 Microsoft 帐户(具有职位名称和办公室位置属性值)进行身份验证,则这些值将作为声明包含在 ID 令牌中。但是,如果我使用租户 bbbb-...-bbbb
的 Microsoft 帐户(也填充了这些相同的属性)进行身份验证,则不包含这些声明。
我不明白为什么;它是一个多租户应用程序,自定义声明是在应用程序本身上配置的,而不是在 Entra 用户目录或特定于我的租户的其他内容上配置的。
如何从所有租户(而不仅仅是我自己的租户)获取用户的这些自定义声明?
对于示例,我创建了一个多租户应用程序并添加了自定义声明,如下所示:
我通过邮差生成了代币:
Grant type: Authorization code
Callback URL: https://oauth.pstmn.io/v1/callback
Auth URL: https://login.microsoftonline.com/common/oauth2/v2.0/authorize
Token URL : https://login.microsoftonline.com/common/oauth2/v2.0/token
Client ID : ClientID
Client Secret : ClientSecret
Scope: api://ClientID/.default openid
我使用 home 租户用户登录,该用户存在于应用程序所在的租户中,并且我成功收到了索赔:
ID令牌:
现在,当我尝试使用 其他租户用户登录时,不会显示声明:
ID令牌:
注意:默认情况下,自定义声明是特定于租户的。如果声明是在
中创建的,那么只有居住在TenantA
中的用户才会获得令牌中的声明。TenantA
要解决此问题,您需要在其他租户中创建的企业应用程序或服务主体中添加声明,如下所示:
现在 自定义声明也已成功显示给另一个租户用户:
声明也显示在访问令牌中。
参考: