[英]Azure AD B2C - “emails” claim in custom policy
我正在尋找一種將emails
聲明(電子郵件集合)添加到 Azure AD B2C 的自定義策略的方法。 此應用程序聲明可直接從 Azure 門戶獲得,但我找不到在需要創建的自定義策略中實現它的方法。
我想要實現的是為我的 WebApp 用戶使用 Azure AD B2C 身份驗證,並將 Azure AD 身份驗證作為員工的自定義身份驗證提供程序,因此這意味着我需要為本地帳戶和 Azure AD 添加兩次emails
聲明。
我按照本指南制定了自定義策略,因此我向 TrustFrameworkExtensions.xml 文件添加了一個新的ClaimsProvider
。
當我下載在 Azure 門戶中創建的注冊和登錄策略時,我可以看到以下輸出聲明:
<OutputClaim ClaimTypeReferenceId="emails" />
我試圖將該行添加到我的自定義策略中,但它沒有返回emails
聲明。
有什么想法嗎?
我也找不到答案 - 看起來“電子郵件”聲明是由自定義 OutputClaimsTransformation 返回的,其配置在示例中不可用。
我確實在 SO 上找到了這個答案,這很有幫助,但它涵蓋了針對新用戶的“otherMails”聲明的更新,並且我有現有用戶無法以這種方式更新的基本政策。
似乎通過將“otherMails”(在社交注冊的情況下)與“signInNames”數組中的第一個條目連接起來來填充電子郵件。
我最終執行以下操作以動態創建“電子郵件”聲明。
在 TrustFrameworkExtensions.xml 中創建兩個新的 ClaimType
<ClaimType Id="emails">
<DisplayName>Emails</DisplayName>
<DataType>stringCollection</DataType>
<UserHelpText>User's email addresses</UserHelpText>
</ClaimType>
<ClaimType Id="firstOtherMail">
<DisplayName>First Other mail</DisplayName>
<DataType>string</DataType>
<UserHelpText>Other Mail</UserHelpText>
</ClaimType>
在 TrustFrameworkExtensions.xml 中創建 3 個新的 ClaimsTransformations
<ClaimsTransformation Id="GetFirstOtherMail" TransformationMethod="GetSingleItemFromStringCollection">
<InputClaims>
<InputClaim ClaimTypeReferenceId="otherMails" TransformationClaimType="collection" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="firstOtherMail" TransformationClaimType="extractedItem" />
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformation Id="CopyFirstOtherMailToEmail" TransformationMethod="AddItemToStringCollection">
<InputClaims>
<InputClaim ClaimTypeReferenceId="firstOtherMail" TransformationClaimType="item" />
<InputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" />
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformation Id="CopySignInNamesEmailToEmails" TransformationMethod="AddItemToStringCollection">
<InputClaims>
<InputClaim ClaimTypeReferenceId="signInNames.emailAddress" TransformationClaimType="item" />
<InputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" />
</OutputClaims>
</ClaimsTransformation>
在 TrustFrameworkExtensions.xml 中創建一個新的 TechnicalProfile:
<!-- The following technical profile is used to create the emails collection after user authenticates. -->
<TechnicalProfile Id="AAD-UserCreateEmailsClaim">
<Metadata>
<Item Key="Operation">Read</Item>
<Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
</Metadata>
<IncludeInSso>false</IncludeInSso>
<InputClaims>
<InputClaim ClaimTypeReferenceId="objectId" Required="true" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="emails" />
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="GetFirstOtherMail"/>
<OutputClaimsTransformation ReferenceId="CopySignInNamesEmailToEmails"/>
<OutputClaimsTransformation ReferenceId="CopyFirstOtherMailToEmail"/>
</OutputClaimsTransformations>
<IncludeTechnicalProfile ReferenceId="AAD-Common" />
</TechnicalProfile>
在 SignUpOrSignIn 中的最后一步 (SendClaims) 之前,將新的 OrchestrationStep 添加到 SignUpOrSignIn UserJourney
<OrchestrationStep Order="8" Type="ClaimsExchange">
<ClaimsExchanges>
<!-- create the emails claim combining signInNames and otherMails -->
<ClaimsExchange Id="AADUserCreateEmailsClaim" TechnicalProfileReferenceId="AAD-UserCreateEmailsClaim" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="9" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
編輯 PolicyProfile TechnicalProfile 並添加 OutputClaim:
<OutputClaim ClaimTypeReferenceId="emails" />
我采用了更簡單的方法,只是在SignInSignUp.xml 中添加了以下輸出聲明(我保留了現有的電子郵件輸出聲明,無論如何只會為社交登錄填充)
<OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.