Azure AD B2C - электронная почта утверждения в настраиваемой политике

Я ищу способ добавить emails заявку (набор писем) в настраиваемую политику для Azure AD B2C. Это заявление о приложении доступно напрямую на портале Azure, но я не могу найти способ реализовать его в настраиваемой политике, которую мне нужно создать.

Я хочу добиться проверки подлинности Azure AD B2C для моих пользователей WebApp и проверки подлинности Azure AD в качестве настраиваемого поставщика проверки подлинности для сотрудников, поэтому это означает, что мне нужно будет добавить emails утверждение дважды - для локальных учетных записей и для Azure AD.

Я следил за этим руководством по создать собственную политику, поэтому я добавил новый ClaimsProvider в файл TrustFrameworkExtensions.xml.

Когда я загружаю политику регистрации и входа, созданную на портале Azure, я вижу следующее выходное утверждение:

<OutputClaim ClaimTypeReferenceId="emails" />

Я попытался добавить эту строку в свою политику, но претензия emails не возвращается.

Любые идеи?


person Sebastian Możejko    schedule 16.10.2017    source источник
comment
Откуда вы пытаетесь получить адрес электронной почты, прежде чем вставить его в токен? Это Rest API или просто вход в локальную учетную запись? Если у вас есть новый технический профиль, было бы хорошо добавить его в вопрос. В противном случае упомяните стартовый пакет и свой сценарий.   -  person Omer Iqbal    schedule 16.10.2017
comment
Этот пост не работает, а этот работает.   -  person ton.yeung    schedule 21.04.2021


Ответы (2)


Я тоже не смог найти ответа - похоже, что претензия "электронные письма" возвращается пользовательской функцией OutputClaimsTransformation, конфигурация которой недоступна в примерах.

Я нашел этот ответ на SO, который помог, но он охватывает обновленное требование «otherMails» для НОВЫХ пользователей, и у меня были существующие пользователи по основным политикам, которых я не мог обновить таким образом.

Кажется, что электронные письма заполняются путем объединения «otherMails» (в случае регистрации в социальных сетях) с первой записью в массиве «signInNames».

В итоге я сделал следующее, чтобы динамически создавать претензию "электронные письма".

Создайте два новых типа ClaimTypes в TrustFrameworkExtensions.xml

  <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>

Создайте 3 новых ClaimsTransformations в TrustFrameworkExtensions.xml

<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:

<!-- 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>

Добавьте новый шаг OrchestrationStep в UserJourney SignUpOrSignIn непосредственно перед последним шагом (SendClaims) в SignUpOrSignIn

    <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 и добавьте OutputClaim:

 <OutputClaim ClaimTypeReferenceId="emails" />
person RNDThoughts    schedule 26.02.2018
comment
Ты спасатель! - person Granville Schmidt; 17.05.2018
comment
Политика ... арендатора ... делает ссылку на ClaimType с идентификатором firstOtherMail, но ни политика, ни какая-либо из ее базовых политик не содержат такого элемента ... - person JJS; 05.06.2018
comment
Извините, я пропустил это - см. Исправленный ответ. - person RNDThoughts; 05.06.2018
comment
@RND Думает, что это не работает с интеграцией Multitenant Azure Active Directory в B2C. Вы знаете почему? - person SINFER; 06.02.2020
comment
@RNDThoughts Спасибо за ясный и точный ответ. В моем случае настраиваемая политика SignInSignUp.xml выдавала ошибку при загрузке. На самом деле претензий по электронной почте не существует в объекте пользователя. Итак, обновление технического профиля в соответствии с этим: stackoverflow.com/questions/56194593/ помог мне - person DvG; 10.08.2020

Я выбрал гораздо более простой путь и просто добавил следующее выходное утверждение в SignInSignUp.xml (я оставил существующее выходное утверждение email, которое в любом случае заполняется только для социальных входы)

<OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
person Andrei Matracaru    schedule 13.01.2020
comment
это ничего не дало мне, что еще можно было добавить? - person Hawkzey; 24.02.2021
comment
это работает для Google, Facebook. но яблоко отправляет заявку по электронной почте в виде писем. - person chaitanyasingu; 23.06.2021