Проверка B2C API REST

#azure-ad-b2c #azure-ad-b2c-custom-policy

Вопрос:

В нашем потоке забытых паролей я хочу выполнить вызов REST API для проверки подлинности учетной записи. У нас есть база данных, которую нам нужно проверить.

Во время этого процесса API вернет 200 или 400.

Если это 200, я хочу, чтобы они продолжили оркестровку забытого пароля.

Если это 400, вместо того, чтобы вытаскивать их из потока и возвращать в приложение, я бы предпочел показать им, что с их учетной записью возникла проблема, и обратиться в нашу службу поддержки или зарегистрировать новую учетную запись.

Однако, независимо от того, какой ответ, в моем текущем коде он отправляется на этапе оркестровки.

Это этап оркестровки:

 <OrchestrationStep Order="2" Type="ClaimsExchange">
          <ClaimsExchanges>
                <ClaimsExchange Id="GetMemberClaimsExchange" TechnicalProfileReferenceId="MemberAccountHolderCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>
 

тогда это мой поставщик претензий.

 <ClaimsProvider>
      <DisplayName>REST API to Check Member Status</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="MemberAccountHolderCollector">
          <DisplayName>Collect Member Info Technical Profile</DisplayName>
          <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <Metadata>
            <Item Key="ContentDefinitionReferenceId">api.selfasserted.register</Item>
          </Metadata>
          <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="REST-CheckMemberAccountHolder" ContinueOnError="true"/>
          </ValidationTechnicalProfiles>
        </TechnicalProfile>

        <TechnicalProfile Id="REST-CheckMemberAccountHolder">
          <DisplayName>Rest API call to Check Member status</DisplayName>
          <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <Metadata>
            <Item Key="ServiceUrl">{API}</Item>
            <Item Key="SendClaimsIn">QueryString</Item>
            <Item Key="AuthenticationType">None</Item>
            <Item Key="AllowInsecureAuthInProduction">true</Item>
          </Metadata>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="emailaddress"/>
          </InputClaims>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="emailaddress" />
          </OutputClaims>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
  </ClaimsProviders>
 

api.selfasserted.register-это просто созданный мной шаблон. Мне не нужно им пользоваться. Я мог бы просто вывести ошибку на экран как угодно, но я просто пытался сделать все, чтобы она заработала.

Здесь ценится любая помощь.

Редактировать:

Спасибо за совет, так что, думаю, я понимаю, к чему вы клоните.

Я добавил тип утверждения

  <ClaimType Id="requireRegister">
    <DisplayName>requireRegster</DisplayName>
    <DataType>boolean</DataType>
    <UserInputType>Paragraph</UserInputType>
  </ClaimType>
 

The idea would be that I can do an output claim.

The problem is when i do this…

 <TechnicalProfiles>
            <TechnicalProfile Id="MemberAccountHolderCollector">
              <DisplayName>Collect Member Info Technical Profile</DisplayName>
              <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
              <Metadata>
                <Item Key="ContentDefinitionReferenceId">api.selfasserted.register</Item>
              </Metadata>
        <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="requireRegister" DefaultValue="true"/>
          </OutputClaims>
              <ValidationTechnicalProfiles>
                <ValidationTechnicalProfile ReferenceId="REST-CheckMemberAccountHolder" ContinueOnError="true"/>
              </ValidationTechnicalProfiles>
            </TechnicalProfile>
 

It shows the page every time, which i don’t want to do either…

Edit 2:

Our forgot password is done off this policy
[enter link description here][1]
[1]: https://docs.microsoft.com/en-us/azure/active-directory-b2c/add-password-reset-policy?pivots=b2c-custom-policy

in our policy when you click the forgot password button it invokes the subjourney

 <SubJourneys>
    <SubJourney Id="PasswordReset" Type="Call">
      <OrchestrationSteps>
        <!-- Validate user's email address. -->
        <OrchestrationStep Order="1" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="PasswordResetUsingEmailAddressExchange" TechnicalProfileReferenceId="LocalAccountDiscoveryUsingEmailAddress" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <!-- Show TOU-->
        <OrchestrationStep Order="2" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="SelfAssertedConsentExchange" TechnicalProfileReferenceId="SelfAsserted-PasswordResetConsent" />
          </ClaimsExchanges>
        </OrchestrationStep>
 

Существует пользовательская страница, на которой мы показываем свое согласие, прежде чем они туда попадут, мне нужна учетная запись, чтобы пройти нашу проверку до этого.

Правка 3:

Выполнение приведенного ниже кода пропускает этап проверки электронной почты в политике «Забыли пароль».

 <ClaimsProvider>
<DisplayName>REST API to Check Member</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="LocalAccountDiscoveryUsingEmailAddress">
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="REST-CheckMemberAccount" ContinueOnError="false"/>
</ValidationTechnicalProfiles>
</TechnicalProfile>

<!--Not using anymore -->
<TechnicalProfile Id="MemberAccountHolderCollector">
<DisplayName>Collect Member Info Technical Profile</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="ContentDefinitionReferenceId">api.selfasserted.register</Item>
</Metadata>
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="REST-CheckMemberAccount" ContinueOnError="false"/>
</ValidationTechnicalProfiles>
</TechnicalProfile>

<TechnicalProfile Id="REST-CheckMemberAccount">
<DisplayName>Rest API call to Check Member status</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="ServiceUrl">{API}</Item>
<Item Key="SendClaimsIn">QueryString</Item>
<Item Key="AuthenticationType">None</Item>
<Item Key="AllowInsecureAuthInProduction">true</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" PartnerClaimType="emailaddress"/>
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="emailaddress" />
</OutputClaims>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
 

Комментарии:

1. @Jas Suri — MSFT Я внес некоторые правки, приняв ваши предложения.

Ответ №1:

Эта конфигурация, в которой нет выходных утверждений как части самостоятельного технического профиля, приведет к тому, что B2C пропустит весь этот шаг.

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

         <TechnicalProfile Id="LocalAccountDiscoveryUsingEmailAddress">
          <DisplayName>Reset password using email address</DisplayName>
          <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <Metadata>
            <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
            <Item Key="ContentDefinitionReferenceId">api.localaccountpasswordreset</Item>
            <Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Your account has been locked. Contact your support person to unlock it, then try again.</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
          </CryptographicKeys>
          <IncludeInSso>false</IncludeInSso>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
            <OutputClaim ClaimTypeReferenceId="objectId" />
            <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" />
            <OutputClaim ClaimTypeReferenceId="requireRegister" DefaultValue="true"/>
          </OutputClaims>
          <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress" />
            <ValidationTechnicalProfile ReferenceId="MemberAccountHolderCollector" />
          </ValidationTechnicalProfiles>
        </TechnicalProfile>

 

Полностью удалите MemberAccountHolderCollector технический профиль. И любая ссылка на это из вашего пользовательского путешествия.

Теперь, после того как пользователь подтвердит свою электронную почту и отправит страницу, будет вызван REST API. Если он возвращает ошибку, она отображается на том же экране, на котором пользователь проверил свою электронную почту.

Вы должны вернуть конфликт HTTP 409 с правильной полезной нагрузкой JSON с ошибкой, чтобы он отображался на экране. https://docs.microsoft.com/en-us/azure/active-directory-b2c/restful-technical-profile#returning-validation-error-message

Комментарии:

1. Хорошо, я немного смущен тем, что вы имеете в виду, когда они проверяют свою электронную почту… В потоке сброса пароля вам отправляется код проверки, после кода проверки вы переходите к шагу 2 на шаге оркестровки правильно? Куда именно я это помещаю? Мы не собираемся использовать Javascript.

2. Также я не против сделать другую конфигурацию. Я просто не хочу, чтобы пользователь покидал приложение, если API возвращает еще что-то, кроме 200.

3. Я внес некоторые правки, приняв ваши предложения.

4. Я пытаюсь выполнить ваше предложение по-разному. Кажется, я не могу заставить его работать. Вы предлагаете не показывать им страницу шаблона, а вместо этого показывать ошибку на экране? Я попробовал это сделать в первый раз, но не смог заставить это работать.

5. Извините за последнее, так как я все еще новичок в этом, и это мой первый шаг проверки, нужно ли мне добавлять этап оркестровки или все это можно сделать за 1 шаг, потому что это то, что я сейчас делаю.