【问题标题】:Azure Active Directory override claim value in OIDC id-tokenAzure Active Directory 覆盖 OIDC id-token 中的声明值
【发布时间】:2022-01-04 16:48:59
【问题描述】:

我正在寻找一种方法来确保 unique_name 声明值始终是通过 SSO 访问的 AAD 中特定应用的用户电子邮件。我注意到对于拥有 AAD 帐户的用户,unique_name 声明值是电子邮件地址,但对于外部用户(被邀请到目录),它以“live.com#”为前缀(例如 live.com#email@域.com)。该应用程序使用 OIDC 协议。我一直在尝试与 Microsoft 文档不同的东西:

  1. 为 unique_name 声明设置不同的来源 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-saml-claims-customization (我不确定这是否适用,因为该应用使用的是 OIDC,而不是 SAML)

(顺便说一句,该文档有点过时了,因为我发现“用户属性和声明”部分现在位于 SSO https://docs.microsoft.com/en-us/answers/questions/248748/cant39-find-the-34user-attributes-amp-claims34-sec.html

  1. 构建声明映射策略 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-claims-mapping

这些都不起作用。

我知道这在具有自定义策略的 AAD B2C 中是微不足道的。是否可以用 AAD 中的电子邮件声明覆盖 unique_name 声明?


2022 年 7 月 1 日更新

经过进一步调查,我发现 unique_name 声明仅在 v1 令牌https://docs.microsoft.com/en-us/azure/active-directory/develop/id-tokenshttps://github.com/MicrosoftDocs/azure-docs/issues/62971(当前版本为 v2)中支持,并且它已转换为“http://schemas.xmlsoap.org/ws/2005 /05/identity/claims/name”由 ADAL 客户端提供。我所追求的这种定制是针对在 v1 AAD 端点上使用 ADAL 的旧版 .NET 应用程序。 我能想到如何实现这一目标的唯一方法是通过索赔映射政策,但是我无法让它发挥作用。任何想法将不胜感激。

【问题讨论】:

    标签: azure-active-directory openid-connect claims-based-identity


    【解决方案1】:

    我相信我已经找到了问题的答案,并且结论是无法覆盖 unique_name 声明,因为它是受限声明。我得到的最接近的是将邮件声明映射到自定义声明(例如 unique_name2)。这就是我所做的:

    https://docs.microsoft.com/en-gb/azure/active-directory/develop/active-directory-claims-mapping

    1. 我安装了 Azure AD PowerShell 模块公共预览版(我必须先卸载 AD Powershell 模块,因为我已经有了更高版本)

    2. 我按照上述文档中的说明连接到 AAD 并查看任何现有的索赔映射政策

    连接-AzureAD -确认

    获取 AzureADPolicy

    1. 我按照https://docs.microsoft.com/en-us/answers/questions/80295/claim-transformation-in-azure-id-token-upn-data-to.html 上的说明建立了一个索赔映射策略,尽管我不得不对其进行调整,因为它不起作用。我运行了以下命令:

    3.1 我使用搜索命令搜索我的应用程序(称为“测试”)。

    GET-AzureADServicePrincipal -SearchString 测试

    这会输出如下表格:

    ObjectId AppId 显示名称


    3.2 我运行以下命令来创建一个新的映射策略,它将“mail”声明映射到“unique_name2”声明。 (当我尝试映射到“unique_name”时,它可以工作,但“unique_name”声明不会被覆盖,因为它是一个受限声明)

    $Policy=New-AzureADPolicy -定义 @('{"ClaimsMappingPolicy":{"Version":1,"IncludeBasicClaimSet":"true", "ClaimsSchema":[{"Source":"user","ID":"mail"},{"Source":"transformation","ID":"DataJoin","TransformationId":"JoinTheData","JwtClaimType ":"unique_name2"}],"ClaimsTransformations":[{"ID":"JoinTheData","TransformationMethod":"Join","InputClaims":[{"ClaimTypeReferenceId":"mail","TransformationClaimType":"string1 "}], “输入参数”: [{"ID":"string2","Value":""},{"ID":"separator","Value":""}],"OutputClaims":[{"ClaimTypeReferenceId":"DataJoin", "TransformationClaimType":"outputClaim"}]}]}}') -DisplayName "MapMailToUniqueName2" -Type "ClaimsMappingPolicy"

    3.3 我运行以下命令将自定义策略添加到我的应用服务主体(从步骤 3.1 复制 id)。这意味着该政策将仅适用于该特定应用。

    Add-AzureADServicePrincipalPolicy -Id {我的应用服务主体 id} -RefObjectId $Policy.Id

    就是这样。当我在我的应用程序上测试 SSO 时,我有一个额外的声明“unique_name2”,其中包含“邮件”声明的值。 在步骤 3.2 中创建映射策略可能有一种更有效的方法,但步骤 3 链接中描述的方法对我不起作用,所以我想出了一个连接到空白字符串的方法。

    似乎无法覆盖 unique_naim 声明,因为它是受限制的声明。后来我发现这实际上记录在这里https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/active-directory/develop/reference-claims-mapping-policy-type.md。我希望我早点找到这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2020-05-26
      • 1970-01-01
      相关资源
      最近更新 更多