Azure AD B2C - 自定义策略中的"电子邮件"声明

Seb*_*jko 6 azure-ad-b2c identity-experience-framework

我正在寻找一种方法来向emailsAzure AD B2C的自定义策略添加声明(电子邮件集合).此应用程序声明可直接从Azure门户获得,但我找不到在我需要创建的自定义策略中实现此方法的方法.

我想要实现的是为我的WebApp用户提供Azure AD B2C身份验证,为员工提供Azure AD身份验证作为自定义身份验证提供程序,这意味着我需要emails为本地帐户和Azure AD 添加两次声明.

我按照本指南制作自定义策略,因此我添加了一个新ClaimsProvider的TrustFrameworkExtensions.xml文件.

当我下载在Azure门户中创建的注册和登录策略时,我可以看到以下输出声明:

<OutputClaim ClaimTypeReferenceId="emails" />
Run Code Online (Sandbox Code Playgroud)

我试图将该行添加到我的自定义策略中,但它不会返回emails声明.

有任何想法吗?

And*_*aru 7

我采用了更简单的方法,只是在SignInSignUp.xml 中添加了以下输出声明(我保留了现有的电子邮件输出声明,无论如何只会为社交登录填充)

<OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
Run Code Online (Sandbox Code Playgroud)


RND*_*hts 6

我也找不到答案-看来自定义OutputClaimsTransformation返回了“电子邮件”声明,该示例的配置不可用。

我确实在SO上找到了这个答案,但有帮助,但是它涵盖了针对新用户的“ otherMails”声明的更新,并且我已有无法以这种方式更新的基本策略的现有用户。

似乎通过将“ otherMails”(在社交注册的情况下)与“ signInNames”数组中的第一个条目连接起来来填充电子邮件。

我最终做了以下操作来动态创建“电子邮件”声明。

在TrustFrameworkExtensions.xml中创建两个新的ClaimTypes

  <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>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

在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" />
Run Code Online (Sandbox Code Playgroud)

编辑PolicyProfile TechnicalProfile并添加OutputClaim:

 <OutputClaim ClaimTypeReferenceId="emails" />
Run Code Online (Sandbox Code Playgroud)

  • 你是救命稻草! (2认同)