簡體   English   中英

Azure AD B2C - 自定義策略中的“電子郵件”聲明

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM