【问题标题】:B2C Validation of REST APIREST API 的 B2C 验证
【发布时间】:2021-10-01 12:16:13
【问题描述】:

在我们忘记密码的流程中,我想做一个 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>

我的想法是我可以做一个输出声明。

问题是当我这样做时......

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

它每次都显示页面,我也不想这样做......

编辑 2:

我们忘记密码是根据这个政策完成的 [在此处输入链接描述][1] [1]:https://docs.microsoft.com/en-us/azure/active-directory-b2c/add-password-reset-policy?pivots=b2c-custom-policy

在我们的政策中,当您单击忘记密码按钮时,它会调用 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>

有一个自定义页面显示我们的 TOU 同意,在他们到达之前,我需要该帐户通过我们的验证。

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

【问题讨论】:

  • @Jas Suri - MSFT 我根据您的建议做了一些修改。

标签: azure-ad-b2c azure-ad-b2c-custom-policy


【解决方案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

【讨论】:

  • 好吧,我有点困惑你的意思是他们在哪里验证他们的电子邮件......在密码重置流程中,你会收到一个验证码,在验证码之后,你会进入编排中的第 2 步步骤正确吗?我到底把这个放在哪里?我们不会使用 Javascript。
  • 我也不反对做不同的配置。如果 API 返回的不是 200,我只是不希望用户离开应用程序。
  • 我根据您的建议做了一些修改。
  • 我正在根据您的建议尝试各种不同的方法。我似乎无法让它工作。您是否建议不要将模板页面提供给他们,而是在屏幕上显示错误?我试过第一个解决这个问题,但我无法让它工作。
  • 对不起,因为我还是新手,这是我的第一个验证步骤,我是否需要在编排步骤中添加,或者这一切都可以通过一个步骤完成,因为这就是我现在正在做。
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2023-02-24
  • 2021-07-21
相关资源
最近更新 更多