分享方式:


使用 Azure Active Directory B2C 自訂原則在使用者旅程圖中建立分支

相同應用程式的不同使用者可以遵循不同的使用者旅程,視自訂原則中的資料值而定。 Azure Active Directory B2C (Azure AD B2C) 自訂原則可讓您有條件地啟用或停用技術設定檔,以達成這項功能。 例如,在使用 Azure AD B2C 自訂原則 驗證使用者輸入中 ,我們使用 來 Precondition 判斷是否應該根據 accountType 宣告的值 執行驗證技術設定檔。

技術設定檔也提供 EnabledForUserJourneys 元素,讓您指定是否應該執行技術設定檔。 元素 EnabledForUserJourneys 包含五個值之一,包括 OnClaimsExistence ,您用來指定只有在技術設定檔中指定的特定宣告存在時,才應該執行技術設定檔。 深入瞭解技術設定檔的 EnabledForUserJourneys 元素。

案例概觀

使用 Azure AD B2C 自訂原則 驗證使用者輸入一文中,使用者會在單一畫面中輸入其詳細資料。 在本文中,使用者必須先選取其帳戶類型 Contoso Employee Account Personal Account 。 選取 Contoso 員工帳戶 的使用者可以繼續提供進一步的詳細資料。 不過,選取 個人帳戶 的使用者必須先提供有效的邀請存取代碼,才能繼續提供進一步的詳細資料。 因此,使用 個人帳戶 帳戶類型的使用者會看到額外的使用者介面來完成其旅程。

A flowchart of branching in user journey.

在本文中,您將瞭解如何使用 EnabledForUserJourneys 技術設定檔內的 元素,根據宣告值建立不同的使用者體驗。

必要條件

注意

本文是 Azure Active Directory B2C 操作指南系列 中建立和執行您自己的自訂原則的一部分 。 建議您從第一篇文章開始此系列。

步驟 1 - 宣告宣告

選取 個人帳戶 的使用者必須提供有效的存取代碼。 因此,我們需要宣告來保存此值:

  1. 在 VS Code 中,開啟 ContosoCustomPolicy.XML 檔案。

  2. 在 區 ClaimsSchema 段中,使用下列程式碼宣告 accessCode 和 isValidAccessCode 宣告:

        <ClaimType Id="accessCode">
            <DisplayName>Access Code</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Enter your invitation access code.</UserHelpText>
            <UserInputType>Password</UserInputType>
            <Restriction>
                <Pattern RegularExpression="[0-9][0-9][0-9][0-9][0-9]" HelpText="Please enter your invitation access code. It's a 5-digit number, something like 95765"/>
            </Restriction>
        </ClaimType>
        <ClaimType Id="isValidAccessCode">
            <DataType>boolean</DataType>
        </ClaimType>
    

步驟 2 - 定義宣告轉換

ClaimsTransformations找出 元素,並新增下列宣告轉換:

    <!---<ClaimsTransformations>-->
        <ClaimsTransformation Id="CheckIfIsValidAccessCode" TransformationMethod="CompareClaimToValue">
            <InputClaims>
                <InputClaim ClaimTypeReferenceId="accessCode" TransformationClaimType="inputClaim1"/>
            </InputClaims>
            <InputParameters>
                <InputParameter Id="compareTo" DataType="string" Value="88888"/>
                <InputParameter Id="operator" DataType="string" Value="equal"/>
                <InputParameter Id="ignoreCase" DataType="string" Value="true"/>
            </InputParameters>
            <OutputClaims>
                <OutputClaim ClaimTypeReferenceId="isValidAccessCode" TransformationClaimType="outputClaim"/>
            </OutputClaims>
        </ClaimsTransformation>
        <ClaimsTransformation Id="ThrowIfIsNotValidAccessCode" TransformationMethod="AssertBooleanClaimIsEqualToValue">
            <InputClaims>
                <InputClaim ClaimTypeReferenceId="isValidAccessCode" TransformationClaimType="inputClaim"/>
            </InputClaims>
            <InputParameters>
                <InputParameter Id="valueToCompareTo" DataType="boolean" Value="true"/>
            </InputParameters>
        </ClaimsTransformation>
    <!---</ClaimsTransformations>-->

我們已定義兩個宣告轉換: CheckIfIsValidAccessCode ThrowIfIsNotValidAccessCode CheckIfIsValidAccessCode 會使用 CompareClaimToValue 轉換方法來比較使用者對靜態值 88888 的存取碼輸入(讓我們使用此值進行測試),並將 或 指派 truefalse isValidAccessCode 宣告。 ThrowIfIsNotValidAccessCode 會檢查兩個宣告的兩個布林值是否相等,如果兩個宣告不相等,則會擲回例外狀況。

步驟 3 - 設定或更新技術設定檔

您現在需要兩個新的自我判斷技術設定檔,一個用來收集帳戶類型,另一個則從使用者收集存取碼。 您也需要新的宣告轉換類型技術設定檔,藉由執行您在步驟 2 定義的宣告轉換來驗證使用者的存取碼。 既然我們要在不同的自我判斷技術設定檔中收集帳戶類型,我們需要更新 UserInformationCollector 自我判斷技術設定檔,以防止它收集帳戶類型。

  1. ClaimsProviders找出 元素,然後使用下列程式碼新增宣告提供者:

        <!--<ClaimsProviders>-->
            <ClaimsProvider>
                <DisplayName>Technical Profiles to collect user's access code</DisplayName>
                <TechnicalProfiles>
                    <TechnicalProfile Id="AccessCodeInputCollector">
                        <DisplayName>Collect Access Code Input from user 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">SelfAssertedContentDefinition</Item>
                            <Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">The access code is invalid.</Item>
                            <Item Key="ClaimTypeOnWhichToEnable">accountType</Item>
                            <Item Key="ClaimValueOnWhichToEnable">personal</Item>
                        </Metadata>
                        <DisplayClaims>
                            <DisplayClaim ClaimTypeReferenceId="accessCode" Required="true"/>
                        </DisplayClaims>
                        <OutputClaims>
                            <OutputClaim ClaimTypeReferenceId="accessCode"/>
                        </OutputClaims>
                        <ValidationTechnicalProfiles>
                            <ValidationTechnicalProfile ReferenceId="CheckAccessCodeViaClaimsTransformationChecker"/>
                        </ValidationTechnicalProfiles>
                        <EnabledForUserJourneys>OnClaimsExistence</EnabledForUserJourneys>
                    </TechnicalProfile>
                    <TechnicalProfile Id="CheckAccessCodeViaClaimsTransformationChecker">
                        <DisplayName>A Claims Transformations to check user's access code validity</DisplayName>
                        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
                        <OutputClaims>
                            <OutputClaim ClaimTypeReferenceId="isValidAccessCode"/>
                        </OutputClaims>
                        <OutputClaimsTransformations>
                            <OutputClaimsTransformation ReferenceId="CheckIfIsValidAccessCode"/>
                            <OutputClaimsTransformation ReferenceId="ThrowIfIsNotValidAccessCode"/>
                        </OutputClaimsTransformations>
                    </TechnicalProfile>
                </TechnicalProfiles>
            </ClaimsProvider>
        <!--</ClaimsProviders>-->
    

    我們已設定兩個技術設定檔 :AccessCodeInputCollector CheckAccessCodeViaClaimsTransformationChecker 我們將 CheckAccessCodeViaClaimsTransformationChecker 技術設定檔稱為 AccessCodeInputCollector 技術設定檔內的 驗證技術設定檔。 CheckAccessCodeViaClaimsTransformationChecker 本身的類型為 Claims Transformation 技術設定檔,它會執行我們在步驟 2 定義的宣告轉換。

    AccessCodeInputCollector 是自我判斷技術設定檔,用來從使用者收集存取碼。 它包含 EnabledForUserJourneys 設定為 OnClaimsExistence 的專案 。 其 Metadata 元素包含宣告 ( accountType ) 及其啟用此技術設定檔的值 ( personal )。

  2. ClaimsProviders找出 元素,然後使用下列程式碼新增宣告提供者:

        <!--<ClaimsProviders>-->
            <ClaimsProvider>
                <DisplayName>Technical Profile to collect user's accountType</DisplayName>
                <TechnicalProfiles>
                    <TechnicalProfile Id="AccountTypeInputCollector">
                        <DisplayName>Collect User Input 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">SelfAssertedContentDefinition</Item>
                        </Metadata>
                        <DisplayClaims>
                            <DisplayClaim ClaimTypeReferenceId="accountType" Required="true"/>
                        </DisplayClaims>
                        <OutputClaims>
                            <OutputClaim ClaimTypeReferenceId="accountType"/>
                        </OutputClaims>
                    </TechnicalProfile>
                </TechnicalProfiles>
            </ClaimsProvider>
        <!--</ClaimsProviders>-->
    

    我們已設定自我判斷技術設定檔, AccountTypeInputCollector 其會收集使用者的帳戶類型。 這是帳戶類型的值,可判斷是否 AccessCodeInputCollector 應該啟用自我判斷技術設定檔。

  3. 若要防止 UserInformationCollector 自我判斷技術設定檔收集帳戶類型,請找出 UserInformationCollector 自我判斷技術設定檔,然後:

    1. accountTypeDisplayClaims 集合中移除顯示宣告 <DisplayClaim ClaimTypeReferenceId="accountType" Required="true"/>

    2. accountTypeOutputClaims 集合中移除輸出宣告 <OutputClaim ClaimTypeReferenceId="accountType"/>

步驟 4 - 更新使用者旅程圖協調流程步驟

現在您已設定技術設定檔,您需要更新使用者旅程圖協調流程步驟:

  1. 找出您的 HelloWorldJourney 使用者旅程圖,並將所有協調流程步驟取代為下列程式碼:

        <!--<OrchestrationSteps>-->
            <OrchestrationStep Order="1" Type="ClaimsExchange">
                <ClaimsExchanges>
                    <ClaimsExchange Id="AccountTypeInputCollectorClaimsExchange" TechnicalProfileReferenceId="AccountTypeInputCollector"/>
                </ClaimsExchanges>
            </OrchestrationStep>
            <OrchestrationStep Order="2" Type="ClaimsExchange">
                <ClaimsExchanges>
                    <ClaimsExchange Id="GetAccessCodeClaimsExchange" TechnicalProfileReferenceId="AccessCodeInputCollector" />
                </ClaimsExchanges>
                </OrchestrationStep>
            <OrchestrationStep Order="3" Type="ClaimsExchange">
                <ClaimsExchanges>
                    <ClaimsExchange Id="GetUserInformationClaimsExchange" TechnicalProfileReferenceId="UserInformationCollector"/>
                </ClaimsExchanges>
            </OrchestrationStep>
            <OrchestrationStep Order="4" Type="ClaimsExchange">
                <ClaimsExchanges>
                    <ClaimsExchange Id="GetMessageClaimsExchange" TechnicalProfileReferenceId="ClaimGenerator"/>
                </ClaimsExchanges>
            </OrchestrationStep>
            <OrchestrationStep Order="5" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer"/>
        <!--</OrchestrationSteps>-->
    

    協調流程步驟顯示,我們會依照協調流程步驟屬性 Order 所顯示的順序呼叫技術設定檔。 不過, AccessCodeInputCollector 如果使用者選取 [個人帳戶] 帳戶 類型,則會啟用技術設定檔。

步驟 5 - 上傳自訂原則檔案

請遵循上傳自訂原則檔案 中的 步驟來上傳您的原則檔案。 如果您要上傳與入口網站中已有相同名稱的檔案,請確定您已選取 [覆寫自訂原則] ,如果檔案已經存在

步驟 6 - 測試自訂原則

請遵循測試自訂原則 中的步驟 來測試您的自訂原則:

  1. 在第一個畫面中,針對 [ 帳戶類型 ],選取 [ 個人帳戶 ]。
  2. 針對 [ 存取碼 ],輸入 88888 ,然後選取 [ 繼續 ]。
  3. 視需要輸入其餘的詳細資料,然後選取 [ 繼續 ]。 原則完成執行之後,系統會將您重新導向至 https://jwt.ms ,您會看到已解碼的 JWT 權杖。
  4. 重複步驟 5,但這次,請選取 [帳戶類型 ]、選取 [Contoso 員工帳戶 ],然後遵循提示。

下一步

步驟 3 中,我們會使用 EnabledForUserJourneys 元素來啟用或停用技術設定檔。 或者,您可以在使用者旅程流程步驟內使用 前置條件 來執行或略過協調流程步驟,如我們稍後在此系列中瞭解。

接下來,瞭解: