【问题标题】:Displaying the error message with an Azure AD B2C custom policy for password reset使用 Azure AD B2C 自定义密码重置策略显示错误消息
【发布时间】:2019-03-06 19:46:38
【问题描述】:

我已按照 SO question 和 AssertBooleanClaimIsEqualToValue documentation 中的步骤进行操作。

但是,我无法显示错误消息。

我有一个自定义密码重置流程的电子邮件链接。该链接验证用户,因此我不需要用户按照正常的密码重置流程验证电子邮件地址。

当用户点击链接时,我设置了一个自定义属性,让用户不能点击两次链接。在这种情况下,我想显示一条错误消息。

<UserJourney Id="PasswordReset-Custom">
      <OrchestrationSteps>

        <OrchestrationStep Order="1" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="PasswordResetUsingEmailAddress" TechnicalProfileReferenceId="AAD-UserReadUsingEmailAddress" />
          </ClaimsExchanges>
        </OrchestrationStep>    

        <OrchestrationStep Order="2" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="NewCredentials" TechnicalProfileReferenceId="LocalAccountWritePasswordUsingObjectId" />
          </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="3" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="UpdateFlag" TechnicalProfileReferenceId="AAD-UserWriteProfileUsingObjectId" />
          </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="4" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
      </OrchestrationSteps>
      <ClientDefinition ReferenceId="DefaultWeb" />
    </UserJourney>

AAD-UserWriteProfileUsingObjectId 写入一个标志以指示旅程已完成。

<TechnicalProfile Id="LocalAccountWritePasswordUsingObjectId">
                    <DisplayName>Change password (username)</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.localaccountpasswordreset</Item>
            <Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Process complete blah.</Item>
                    </Metadata>
                    <CryptographicKeys>
                        <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
                    </CryptographicKeys>
                    <InputClaims>
                        <InputClaim ClaimTypeReferenceId="objectId" />
                    </InputClaims>
                    <OutputClaims>
                        <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
                        <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
                    </OutputClaims>
                    <ValidationTechnicalProfiles>
                        <ValidationTechnicalProfile ReferenceId="AAD-UserWritePasswordUsingObjectId" />
                    </ValidationTechnicalProfiles>
                </TechnicalProfile>

这有一个验证 TP AAD-UserWritePasswordUsingObjectId。

<TechnicalProfile Id="AAD-UserWritePasswordUsingObjectId">
                    <Metadata>
                        <Item Key="Operation">Write</Item>
                        <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>            
                    </Metadata>
                    <IncludeInSso>false</IncludeInSso>
                    <InputClaims>
                        <InputClaim ClaimTypeReferenceId="objectId" Required="true" />
                    </InputClaims>          
                    <PersistedClaims>
                        <PersistedClaim ClaimTypeReferenceId="objectId" />
                        <PersistedClaim ClaimTypeReferenceId="newPassword" PartnerClaimType="password"/>
                    </PersistedClaims>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="dummyObjectId" />
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="EnsureCompletedIsTrue" />
          </OutputClaimsTransformations>
                    <IncludeTechnicalProfile ReferenceId="AAD-Common" />
                </TechnicalProfile>

这有一个 OutputClaimsTransformation EnsureCompletedIsTrue。

<ClaimsTransformation Id="EnsureCompletedIsTrue" TransformationMethod="AssertBooleanClaimIsEqualToValue">
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="extension_Completed" TransformationClaimType="inputClaim" />
        </InputClaims>
        <InputParameters>
          <InputParameter Id="valueToCompareTo" DataType="boolean" Value="true" />
        </InputParameters>
      </ClaimsTransformation>

因此,如果 extension_Completed 为 True,它应该抛出错误消息“处理完成”。

我已检查标志是否为真,但我从未看到错误消息?

【问题讨论】:

    标签: azure-ad-b2c


    【解决方案1】:

    根据doc,它断言声明值符合预期,否则抛出错误。您是针对“真”断言它,但不应该针对“假”吗?

    如果该链接从未被使用过,则声明值为 false。完成验证以断言这是错误的。一旦它被使用,声明值应该是真实的(我相信你会在某个地方处理这个问题)。如果用户再次使用该链接,则声明值现在为 true,并且断言将抛出,因为它期望一个 false 值。

    <ClaimsTransformation Id="EnsureCompletedIsTrue" TransformationMethod="AssertBooleanClaimIsEqualToValue">
        <InputClaims>
            <InputClaim ClaimTypeReferenceId="extension_Completed" TransformationClaimType="inputClaim" />
        </InputClaims>
        <InputParameters>
            <InputParameter Id="valueToCompareTo" DataType="boolean" Value="false" />
        </InputParameters>
    </ClaimsTransformation>
    

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      相关资源
      最近更新 更多