Azure Active Directory 覆盖 OIDC 标识令牌中的声明值
Azure Active Directory override claim value in OIDC id-token
我正在寻找一种方法来确保 unique_name 声明值始终是 AAD 中通过 SSO 访问的特定应用程序的用户电子邮件。我注意到对于拥有 AAD 帐户的用户,unique_name 声明值是电子邮件地址,但对于外部用户(被邀请到目录),它以“live.com#”为前缀(例如live.com#email@domain.com)。该应用程序使用 OIDC 协议。我一直在尝试 Microsoft 文档中的不同内容:
- 为 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)
- 建立声明映射政策
https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-claims-mapping
None 个有效。
我知道这在具有自定义策略的 AAD B2C 中是微不足道的。是否可以使用 AAD 中的电子邮件声明覆盖 unique_name 声明?
更新 07/01/2022
经过进一步调查,我发现 unique_name 声明仅在 v1 令牌 https://docs.microsoft.com/en-us/azure/active-directory/develop/id-tokens, https://github.com/MicrosoftDocs/azure-docs/issues/62971 中受支持(当前版本为 v2),并且已转换为“http://schemas.xmlsoap .org/ws/2005/05/identity/claims/name" 由 ADAL 客户端提供。我所追求的这种定制适用于在 v1 AAD 端点上使用 ADAL 的旧版 .NET 应用程序。
我能想到如何实现这一点的唯一方法是通过声明映射策略,但我一直无法让它发挥作用。任何想法将不胜感激。
我相信我已经找到问题的答案,结论是无法推翻 unique_name 声明,因为它是一个受限声明。我得到的最接近的是将邮件声明映射到自定义声明(例如 unique_name2)。这就是我所做的:
https://docs.microsoft.com/en-gb/azure/active-directory/develop/active-directory-claims-mapping
我安装了 Azure AD PowerShell 模块 public 预览版(我不得不先卸载 AD Powershell 模块,因为我已经有了更高版本)
我按照上述文档中的说明连接到 AAD 并查看任何现有的声明映射策略
Connect-AzureAD -Confirm
Get-AzureADPolicy
- 我按照 https://docs.microsoft.com/en-us/answers/questions/80295/claim-transformation-in-azure-id-token-upn-data-to.html 上的说明构建了一个声明映射策略,尽管我不得不对其进行调整,因为它不起作用。我运行以下命令:
3.1 我使用搜索命令搜索我的应用程序(称为“测试”)。
GET-AzureADServicePrincipal -SearchString Test
这会输出一个 table,如下所示:
ObjectId AppId DisplayName
3.2 我 运行 以下命令创建一个新的映射策略,将“邮件”声明映射到“unique_name2”声明。 (当我尝试映射到“unique_name”时它有效,但“unique_name”声明不会被覆盖,因为它是一个受限声明)
$Policy=New-AzureADPolicy -Definition
@('{"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"}],
"InputParameters":
[{"ID":"string2","Value":""},{"ID":"separator","Value":""}],"OutputClaims":[{"ClaimTypeReferenceId":"DataJoin","TransformationClaimType":"outputClaim"}]}]}}')
-DisplayName "MapMailToUniqueName2" -Type "ClaimsMappingPolicy"
3.3 我 运行 以下命令将自定义策略添加到我的应用程序服务主体(从步骤 3.1 复制 ID)。这意味着该政策将仅适用于该特定应用。
Add-AzureADServicePrincipalPolicy -Id {my app service principal id}
-RefObjectId $Policy.Id
就是这样。当我在我的应用程序上测试 SSO 时,我有一个额外的声明“unique_name2”,其中包含“邮件”声明的值。
在步骤 3.2 中可能有一种更有效的创建映射策略的方法,但是步骤 3 link 中描述的方法对我不起作用,所以我想出了一个连接到空白字符串的方法。
似乎无法推翻 unique_naim 声明,因为它是一个受限声明。后来我发现这实际上记录在这里https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/active-directory/develop/reference-claims-mapping-policy-type.md。我希望我早点找到这个。
我正在寻找一种方法来确保 unique_name 声明值始终是 AAD 中通过 SSO 访问的特定应用程序的用户电子邮件。我注意到对于拥有 AAD 帐户的用户,unique_name 声明值是电子邮件地址,但对于外部用户(被邀请到目录),它以“live.com#”为前缀(例如live.com#email@domain.com)。该应用程序使用 OIDC 协议。我一直在尝试 Microsoft 文档中的不同内容:
- 为 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)
- 建立声明映射政策 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-claims-mapping
None 个有效。
我知道这在具有自定义策略的 AAD B2C 中是微不足道的。是否可以使用 AAD 中的电子邮件声明覆盖 unique_name 声明?
更新 07/01/2022
经过进一步调查,我发现 unique_name 声明仅在 v1 令牌 https://docs.microsoft.com/en-us/azure/active-directory/develop/id-tokens, https://github.com/MicrosoftDocs/azure-docs/issues/62971 中受支持(当前版本为 v2),并且已转换为“http://schemas.xmlsoap .org/ws/2005/05/identity/claims/name" 由 ADAL 客户端提供。我所追求的这种定制适用于在 v1 AAD 端点上使用 ADAL 的旧版 .NET 应用程序。 我能想到如何实现这一点的唯一方法是通过声明映射策略,但我一直无法让它发挥作用。任何想法将不胜感激。
我相信我已经找到问题的答案,结论是无法推翻 unique_name 声明,因为它是一个受限声明。我得到的最接近的是将邮件声明映射到自定义声明(例如 unique_name2)。这就是我所做的:
https://docs.microsoft.com/en-gb/azure/active-directory/develop/active-directory-claims-mapping
我安装了 Azure AD PowerShell 模块 public 预览版(我不得不先卸载 AD Powershell 模块,因为我已经有了更高版本)
我按照上述文档中的说明连接到 AAD 并查看任何现有的声明映射策略
Connect-AzureAD -Confirm
Get-AzureADPolicy
- 我按照 https://docs.microsoft.com/en-us/answers/questions/80295/claim-transformation-in-azure-id-token-upn-data-to.html 上的说明构建了一个声明映射策略,尽管我不得不对其进行调整,因为它不起作用。我运行以下命令:
3.1 我使用搜索命令搜索我的应用程序(称为“测试”)。
GET-AzureADServicePrincipal -SearchString Test
这会输出一个 table,如下所示:
ObjectId AppId DisplayName
3.2 我 运行 以下命令创建一个新的映射策略,将“邮件”声明映射到“unique_name2”声明。 (当我尝试映射到“unique_name”时它有效,但“unique_name”声明不会被覆盖,因为它是一个受限声明)
$Policy=New-AzureADPolicy -Definition @('{"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"}], "InputParameters": [{"ID":"string2","Value":""},{"ID":"separator","Value":""}],"OutputClaims":[{"ClaimTypeReferenceId":"DataJoin","TransformationClaimType":"outputClaim"}]}]}}') -DisplayName "MapMailToUniqueName2" -Type "ClaimsMappingPolicy"
3.3 我 运行 以下命令将自定义策略添加到我的应用程序服务主体(从步骤 3.1 复制 ID)。这意味着该政策将仅适用于该特定应用。
Add-AzureADServicePrincipalPolicy -Id {my app service principal id} -RefObjectId $Policy.Id
就是这样。当我在我的应用程序上测试 SSO 时,我有一个额外的声明“unique_name2”,其中包含“邮件”声明的值。 在步骤 3.2 中可能有一种更有效的创建映射策略的方法,但是步骤 3 link 中描述的方法对我不起作用,所以我想出了一个连接到空白字符串的方法。
似乎无法推翻 unique_naim 声明,因为它是一个受限声明。后来我发现这实际上记录在这里https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/active-directory/develop/reference-claims-mapping-policy-type.md。我希望我早点找到这个。