Поток учетных данных пароля владельца ресурса - изменение утверждений

Поток учетных данных пароля владельца ресурса теперь доступен в предварительной версии для Azure B2C:

https://docs.microsoft.com/en-us/azure/active-directory-b2c/configure-ropc

Тем не менее, я хотел бы повозиться с претензиями (в частности: получить имя пользователя как претензию по электронной почте). Я попытался просто вызвать свои существующие настраиваемые политики в IEF с потоком из документации, но им это не понравилось (неудовлетворительно)

AADB2C: возникла исключительная ситуация.

Есть ли способ повлиять на претензии в этом потоке?

Обновление При реализации ответа Криса я получил эту ошибку:

Невозможно загрузить политику. Причина: проверка не удалась: в политике «B2C_1A_ROPC» клиента «xxx.onmicrosoft.com» обнаружена 1 ошибка проверки. Тип претензии «электронная почта» является выходным заявлением технического профиля проверяющей стороны, но не является выходным заявлением. на любом из этапов пути пользователя «SignIn-ROPC».

Я выложил экспериментальное решение как отдельный ответ.


person Alex AIT    schedule 26.07.2018    source источник


Ответы (2)


Вы должны реализовать поток ROPC в настраиваемой политике, чтобы выдать «электронное письмо» в токене идентификатора.

Чтобы реализовать поток ROPC в настраиваемой политике:

1. Добавьте атрибут DefaultValue к каждому из элементов "signInName" и "password" <InputClaim /> в техническом профиле login-NonInteractive:

<TechnicalProfile Id="login-NonInteractive">
  <DisplayName>Local Account SignIn</DisplayName>
  <Protocol Name="OpenIdConnect" />
  ...
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="username" Required="true" DefaultValue="{OIDC:Username}" />
    <InputClaim ClaimTypeReferenceId="password" Required="true" DefaultValue="{OIDC:Password}" />
    ...
  </InputClaims>
  ...
</TechnicalProfile>

2. Создайте путь пользователя «ROPC»:

<UserJourney Id="SignIn-ROPC">
  <PreserveOriginalAssertion>false</PreserveOriginalAssertion>
  <OrchestrationSteps>
    <OrchestrationStep Order="1" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="LoginNonInteractiveExchange" TechnicalProfileReferenceId="login-NonInteractive" />
      </ClaimsExchanges>
    </OrchestrationStep>
    <OrchestrationStep Order="2" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
      </ClaimsExchanges>
    </OrchestrationStep>
    <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
  </OrchestrationSteps>
</UserJourney>

3. Создайте технический профиль проверяющей стороны ROPC:

<RelyingParty>
  <DefaultUserJourney ReferenceId="SignIn-ROPC" />
  <TechnicalProfile Id="PolicyProfile">
    <DisplayName>PolicyProfile</DisplayName>
    <Protocol Name="OpenIdConnect" />
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
      <OutputClaim ClaimTypeReferenceId="email" />
    </OutputClaims>
    <SubjectNamingInfo ClaimType="sub" />
  </TechnicalProfile>
</RelyingParty>
person Chris Padgett    schedule 26.07.2018
comment
Спасибо! У меня все заработало. Однако мне пришлось внести некоторые изменения, чтобы получить электронное письмо. Мне пришлось использовать signInName для некоторых пользователей и signinNames.emailAddress для других. Не совсем уверен, что решение, которое у меня сейчас есть, на 100% правильное, но это начало. - person Alex AIT; 29.07.2018
comment
Я опубликовал свое экспериментальное решение как отдельный ответ, надеюсь, все в порядке. - person Alex AIT; 29.07.2018

Это полная политика, с которой я работал, используя полезный ответ Криса. Я бы счел это экспериментальным, так как я не совсем понимаю поток заявок, но он работает довольно хорошо.

<ClaimsProviders>
    <ClaimsProvider>
        <DisplayName>Override some profiles</DisplayName>
        <TechnicalProfiles>
            <TechnicalProfile Id="login-NonInteractive">
                <DisplayName>Local Account SignIn</DisplayName>
                <Protocol Name="OpenIdConnect" />
                <InputClaims>
                    <InputClaim ClaimTypeReferenceId="signInName" 
                        PartnerClaimType="username" 
                        Required="true" 
                        DefaultValue="{OIDC:Username}" />
                    <InputClaim ClaimTypeReferenceId="password" 
                        Required="true" 
                        DefaultValue="{OIDC:Password}" />
                </InputClaims>
            </TechnicalProfile>
            <TechnicalProfile Id="AAD-UserReadUsingObjectId">
                <OutputClaims>
                    <!-- This user journey does not have any other step that provides this -->
                    <OutputClaim ClaimTypeReferenceId="signInName" />
                </OutputClaims>
            </TechnicalProfile>
        </TechnicalProfiles>
    </ClaimsProvider>
</ClaimsProviders>
<UserJourneys>
    <UserJourney Id="SignIn-ROPC">
        <PreserveOriginalAssertion>false</PreserveOriginalAssertion>
        <OrchestrationSteps>
            <OrchestrationStep Order="1" 
                Type="ClaimsExchange">
                <ClaimsExchanges>
                    <ClaimsExchange Id="LoginNonInteractiveExchange" 
                        TechnicalProfileReferenceId="login-NonInteractive" />
                </ClaimsExchanges>
            </OrchestrationStep>
            <OrchestrationStep Order="2" 
                Type="ClaimsExchange">
                <ClaimsExchanges>
                    <ClaimsExchange Id="AADUserReadWithObjectId" 
                        TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
                </ClaimsExchanges>
            </OrchestrationStep>
            <OrchestrationStep Order="3" 
                Type="SendClaims" 
                CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
        </OrchestrationSteps>
    </UserJourney>
</UserJourneys>
<RelyingParty>
    <DefaultUserJourney ReferenceId="SignIn-ROPC" />
    <TechnicalProfile Id="PolicyProfile">
        <DisplayName>PolicyProfile</DisplayName>
        <Protocol Name="OpenIdConnect" />
        <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="objectId" 
                PartnerClaimType="sub"/>
            <!-- This works for accounts that were created via the azure portal -->
            <OutputClaim ClaimTypeReferenceId="signInName" 
                PartnerClaimType="email" />
            <!-- This works for accounts that signed up themselves -->
            <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" 
                PartnerClaimType="email" />
        </OutputClaims>
        <SubjectNamingInfo ClaimType="sub" />
    </TechnicalProfile>
</RelyingParty>
person Alex AIT    schedule 28.07.2018