【问题标题】:AAD B2C Validation technical profile with multiple preconditions in logical ANDAAD B2C 验证技术配置文件在逻辑 AND 中具有多个先决条件
【发布时间】:2022-01-23 02:25:26
【问题描述】:

我最近开始研究 Azure Active Directory B2C 自定义策略。我试图了解如何将多个先决条件添加到验证技术配置文件中,以便在所有条件都为真(逻辑 AND)时跳过它。默认行为是 OR。 这是我在 DisplayControl > Actions 块中自定义策略定义的一部分。

<Action Id="VerifyCode">
    <ValidationClaimsExchange>
        <ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="VerifyOtp">
            <Preconditions>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                    <Value>email</Value>
                    <Value>automatedtest@test.com</Value>
                    <Action>SkipThisValidationTechnicalProfile</Action>
                </Precondition>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                    <Value>otp</Value>
                    <Value>7777777</Value>
                    <Action>SkipThisValidationTechnicalProfile</Action>
                </Precondition>
            </Preconditions>
        </ValidationClaimsExchangeTechnicalProfile>
    </ValidationClaimsExchange>
</Action>

如果电子邮件声明是automatedtest@test.com 并且otp 声明是7777777,我想要实现的是跳过此验证技术配置文件。 我一直在研究string claim transformations,我可以用它来连接两个字符串声明以获得单个字符串,然后将其与测试值进行比较,但这听起来很愚蠢。

最好的方法是什么?

【问题讨论】:

    标签: azure-ad-b2c


    【解决方案1】:

    • 前提条件是成功交易必须遵循的编排步骤元素。如果任何步骤失败,则事务失败。此外,Azure AD B2C 按列表顺序评估先决条件。基于顺序的先决条件允许您设置应用先决条件的顺序,因为这些是用户旅程的一部分。

    满足的第一个前提条件将覆盖所有后续前提条件。仅当不满足所有先决条件时才执行编排步骤。

    因此,前置条件元素本身的基本结构基于“或”条件,并且两个声明,即电子邮件和 OTP 不能在同一个前置条件元素中传递,因此您对条件的要求是无法配置逻辑上的“与”。

    此外,除了“SkipThisOrchestrationStep”之外,不能在前置条件元素中传递其他操作,因此也无法通过它重定向到另一个前置条件。

    • 但是您可以在下面同样配置您的先决条件,以通过这两个先决条件,然后跳过编排步骤:-

               <Preconditions>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                    <Value>email</Value>
                    <Value>automatedtest@test.com</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                    <Value>automatedtest@test.com</Value>
        <Value>true</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                    <Value>otp</Value>
                    <Value>7777777</Value>
                    <Action>SkipThisValidationTechnicalProfile</Action>
                </Precondition>
               </Preconditions>
    

    虽然,它变得有些冗长,但满足您检查两个声明的要求。请在下面的社区线程中找到更多详细信息:-

    Azure AD B2C Custom Policy Orchestration Step Precondition Actions

    https://docs.microsoft.com/en-us/azure/active-directory-b2c/userjourneys#precondition

    【讨论】:

    • 如果您查看您发布的链接,有一个“ClaimsExist”和一个“ClaimsEquals”。您的示例缺少“ClaimsExist”?
    • 是的,我的示例缺少“ClaimsExist”,因为在此前提条件下,该值必须最初与指定的声明匹配,如果该值不匹配,则不会执行此前提条件并且at 大体跳过,如果匹配,则将继续进行。
    • 感谢您的回答@KartikBhiwapurkar-MT。在您的示例中,我很难理解前提条件 2。它比较 2 个静态值:“automatedtest@test.com”和“true”(而不是声明)。
    • 第二个前提条件确实比较了 'automatedtest@test.com' 和 'true' 值,但不是作为声明,而是作为上面前提条件的返回值。因此,每次检测到电子邮件时,都会检查两个声明。
    • 遗憾的是,这对我不起作用。我刚刚在我的政策@KartikBhiwapurkar-MT 中复制了您的示例。不应该跳过验证技术配置文件。此外,我还不清楚第一个条件的值如何在第二个条件下结束,以及比较 2 个不同的静态值如何导致匹配(在第二个条件下)。如果在 Microsoft docs 上有一些关于此的文档,那就太好了。感谢您的帮助。
    【解决方案2】:

    我不明白答案。看看这方面的一些文档会很有用。

    无论如何,真正冗长的方法是:

    有一个包含三个声明转换的 TP。将 TP 称为旅程中的一个步骤。

    第一个针对电子邮件执行 CompareClaims

    第二个针对 OTP 执行 CompareClaims

    第三个对上述两个布尔值执行布尔值 AndClaims

    使用输出作为前提条件。

    【讨论】:

    • 谢谢。我最后做了类似的事情。我创建了一个声明转换,它连接了 2 个声明,然后在验证技术配置文件的前提条件下将输出与测试值进行比较。如果您可以将多个先决条件连接到一个地方,生活会轻松得多。
    • 希望您已经参考了 Azure AD B2C 的文档链接,并声明上述前提条件的转换:-docs.microsoft.com/en-us/azure/active-directory-b2c/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多