Миграция AAD B2C - Пользовательская политика входа ROPC с Rest-API Интеграция с устаревшим IDP - Поддерживается ли это?

Я пытаюсь выполнить перечисленную здесь бесшовную миграцию учетной записи, поскольку наши пароли хешируются, а наши пользователи находятся в базе данных, https://github.com/azure-ad-b2c/user-migration

Мы используем мобильное устройство и заставили пользователей перейти из базы данных в рамках миграции, я следил

1) Пользовательская политика ROPC https://docs.microsoft.com/en-us/azure/active-directory-b2c/ropc-custom?tabs=app-reg-ga

2) Определенные настраиваемые атрибуты https://docs.microsoft.com/en-us/azure/active-directory-b2c/user-flow-custom-attributes

3) Настройте Rest-API на Legacy IDP для возврата migrationStatus https://docs.microsoft.com/en-us/azure/active-directory-b2c/custom-policy.-rest-api-intro

Однако я думаю, что ROPC с REST-API не поддерживается? поскольку

ROPC имеет Имя протокола = "OpenIdConnect" по сравнению с

SelfAsserted-LocalAccountSignin-Email имеет Protocol Name = "Proprietary" Handler = "Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null"

и столкнулся с проблемой

Недействительный технический профиль с идентификатором "ResourceOwnerPasswordCredentials-OAUTH2" только обработчик протокола "" Web.TPEngine.Providers.SelfAssertedAttributeProvider "" может иметь ValidationTechnicalProfile.

Я наткнулся на них и заметил, что бесшовная миграция с Rest API во время входа не применяется для ROPC (мобильных устройств)? Это правда ?

https://docs.microsoft.com/en-us/azure/active-directory-b2c/self-asserted-technical-profile.

https://docs.microsoft.com/en-us/azure/active-directory-b2c/openid-connect-technical-profile.

Может ли кто-нибудь сказать мне, как мы выполняем миграцию во время входа в систему с взаимодействием Rest-API для ROPC grant_type?

Путь пользователя

<UserJourney Id="ResourceOwnerPasswordCredentials">
  <PreserveOriginalAssertion>false</PreserveOriginalAssertion>
  <OrchestrationSteps>      
    <OrchestrationStep Order="1" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Email" />
      </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>

а вот технический профиль SelfAsserted-LocalAccountSignin-Email по протоколу SelfAsserted.

поскольку мне не удалось загрузить технический профиль ROPC с помощью ValidationTechnicalProfile по протоколу OpenIdConnect, поскольку в нем говорилось об ошибке, указанной ранее,

<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email">
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="extension_isMigrated" />
          </OutputClaims>
          <ValidationTechnicalProfiles>
            <!--Add user migration validation technical profiles before login-NonInteractive -->

            <!-- Populate extension_requireMigration into the claims pipeline -->
            <ValidationTechnicalProfile ReferenceId="Get-requiresMigration-status-signin" ContinueOnError="false" />

            <!-- If extension_requireMigration is true, call the legacy IdP via the REST API -->
            <ValidationTechnicalProfile ReferenceId="REST-ValidateProfile" ContinueOnError="false">
              <Preconditions>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                  <Value>extension_isMigrated</Value>
                  <Value>True</Value>
                  <Action>SkipThisValidationTechnicalProfile</Action>
                </Precondition>
              </Preconditions>
            </ValidationTechnicalProfile>

            <!-- If the API returned 'tokensuccess', write the new password and unmark the account for migration -->
            <ValidationTechnicalProfile ReferenceId="AAD-WritePasswordAndFlipMigratedFlag" ContinueOnError="false">
              <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                  <Value>requiresMigration</Value>
                  <Value>False</Value>
                  <Action>SkipThisValidationTechnicalProfile</Action>
                </Precondition>
              </Preconditions>
            </ValidationTechnicalProfile>

            <!-- Initiate a normal logon against Azure AD B2C -->
            <ValidationTechnicalProfile ReferenceId="login-NonInteractive" />
          </ValidationTechnicalProfiles>
        </TechnicalProfile>

Ниже приведен технический профиль ROPC, ResourceOwnerPasswordCredentials-OAUTH2, который я пытался загрузить, и который не удался с указанной ошибкой.

    <TechnicalProfile Id="ResourceOwnerPasswordCredentials-OAUTH2">
      <DisplayName>Local Account SignIn</DisplayName>
      <Protocol Name="OpenIdConnect" />
      <Metadata>
        <Item Key="UserMessageIfClaimsPrincipalDoesNotExist">We can't seem to find your account</Item>
        <Item Key="UserMessageIfInvalidPassword">Your password is incorrect</Item>
        <Item Key="UserMessageIfOldPasswordUsed">Looks like you used an old password</Item>
        <Item Key="DiscoverMetadataByTokenIssuer">true</Item>
        <Item Key="ValidTokenIssuerPrefixes">https://sts.windows.net/</Item>
        <Item Key="METADATA">https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration</Item>
        <Item Key="authorization_endpoint">https://login.microsoftonline.com/{tenant}/oauth2/token</Item>
        <Item Key="response_types">id_token</Item>
        <Item Key="response_mode">query</Item>
        <Item Key="scope">email openid</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="logonIdentifier" PartnerClaimType="username" Required="true" DefaultValue="{OIDC:Username}" />
        <InputClaim ClaimTypeReferenceId="password" Required="true" DefaultValue="{OIDC:Password}" />
        <InputClaim ClaimTypeReferenceId="grant_type" DefaultValue="password" />
        <InputClaim ClaimTypeReferenceId="scope" DefaultValue="openid" />
        <InputClaim ClaimTypeReferenceId="nca" PartnerClaimType="nca" DefaultValue="1" />
        <InputClaim ClaimTypeReferenceId="client_id" DefaultValue="XXXXXXXXXXXXX" />
        <InputClaim ClaimTypeReferenceId="resource_id" PartnerClaimType="resource" DefaultValue="XXXXXXXXXXX" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid" />
        <OutputClaim ClaimTypeReferenceId="userPrincipalName" PartnerClaimType="upn" />
        <OutputClaim ClaimTypeReferenceId="extension_isMigrated" />
      </OutputClaims>
      <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromObjectID" />
      </OutputClaimsTransformations>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
      <ValidationTechnicalProfiles>
        <!--Add user migration validation technical profiles before login-NonInteractive -->

        <!-- Populate extension_requireMigration into the claims pipeline -->
        <ValidationTechnicalProfile ReferenceId="Get-requiresMigration-status-signin" ContinueOnError="false" />

        <!-- If extension_requireMigration is true, call the legacy IdP via the REST API -->
        <ValidationTechnicalProfile ReferenceId="REST-ValidateProfile" ContinueOnError="false">
          <Preconditions>
            <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
              <Value>extension_isMigrated</Value>
              <Value>True</Value>
              <Action>SkipThisValidationTechnicalProfile</Action>
            </Precondition>
          </Preconditions>
        </ValidationTechnicalProfile>

        <!-- If the API returned 'tokensuccess', write the new password and unmark the account for migration -->
        <ValidationTechnicalProfile ReferenceId="AAD-WritePasswordAndFlipMigratedFlag" ContinueOnError="false">
          <Preconditions>
            <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
              <Value>requiresMigration</Value>
              <Value>False</Value>
              <Action>SkipThisValidationTechnicalProfile</Action>
            </Precondition>
          </Preconditions>
        </ValidationTechnicalProfile>

        <!-- Initiate a normal logon against Azure AD B2C -->
        <ValidationTechnicalProfile ReferenceId="login-NonInteractive" />
      </ValidationTechnicalProfiles>
    </TechnicalProfile>

person Sudhakar Betha    schedule 17.06.2020    source источник
comment
Не могли бы вы предоставить отрывки из технических профилей? ROPC должен позволить вам теперь вызывать REST API перед техническим профилем ROPC из пользовательского пути. Это было усовершенствование, обеспечивающее плавную миграцию учетных записей для работы с потоками ROPC.   -  person Jas Suri - MSFT    schedule 17.06.2020
comment
@JasSuri Я обновил фрагменты кода для SelfAsserted, поскольку мне не удалось загрузить xml для ROPC с техническим профилем проверки, дайте мне знать, если вам это тоже нужно,   -  person Sudhakar Betha    schedule 17.06.2020
comment
@JasSuri Я загрузил оба xmls-фрагмента с помощью OpenIdConnect и SelfAsserted, дайте мне знать, если мне нужно что-то изменить, чтобы получить, ROPC SignIn- ›RestAPIValidate-› AADWrite- ›token Заранее спасибо   -  person Sudhakar Betha    schedule 17.06.2020
comment
@SudhakarBetha Удалось ли вам исправить эту проблему? У меня такое же требование к проекту, я пробовал все, но все еще получаю ошибки при вызове конечной точки   -  person user1862876    schedule 18.08.2020


Ответы (1)


Поскольку это политика ROPC, она не может содержать никаких самопровозглашенных потоков. Что вам нужно сделать, так это создать такое путешествие:

Шаги оркестровки:

Шаг 1. Прочтите учетную запись пользователя с помощью электронной почты в B2C, выведите extension_requiresMigration

Шаг 2. Если extension_requiresMigration = True - ›Вызовите REST API, чтобы отправить ему учетные данные. Вернуть ошибку, если пароль неверный.

Шаг 3. Если REST API подтвердил правильность учетных данных - ›Запишите пароль пользователя в учетную запись B2C.

Шаг 4. Запустите технический профиль ROPC (вход без взаимодействия)

Шаг 5. Считайте любую другую информацию из учетной записи в AAD B2C.

Шаг 6. Выпустите токен

person Jas Suri - MSFT    schedule 30.06.2020