Azure Active Directory B2C 사용자 지정 정책을 사용하여 사용자 경험에서 분기 만들기

동일한 앱의 여러 사용자는 사용자 지정 정책의 데이터 값에 따라 다양한 사용자 경험을 수행할 수 있습니다. Azure AD B2C(Azure Active Directory B2C) 사용자 지정 정책을 사용하면 이 기능을 달성하기 위해 기술 프로필을 조건부로 사용하거나 사용하지 않도록 설정할 수 있습니다. 예를 들어 Azure AD B2C 사용자 지정 정책을 사용하여 사용자 입력 유효성 검사에서 Precondition을 사용하여 accountType 클레임 값에 따라 유효성 검사 기술 프로필을 실행할지 여부를 결정했습니다.

또한 기술 프로필은 기술 프로필을 실행할지 여부를 지정할 수 있는 EnabledForUserJourneys 요소를 제공합니다. EnabledForUserJourneys 요소에는 기술 프로필에 지정된 특정 클레임이 있는 경우에만 기술 프로필을 실행하도록 지정하는 데 사용하는 OnClaimsExistence를 포함한 5개 값 중 하나가 포함됩니다. 기술 프로필의 EnabledForUserJourneys 요소에 대해 자세히 알아봅니다.

시나리오 개요

Azure AD B2C 사용자 지정 정책을 사용하여 사용자 입력 유효성 검사 문서에서 사용자는 단일 화면에 세부 정보를 입력합니다. 이 문서에서 사용자는 먼저 계정 유형인 Contoso 직원 계정 또는 개인 계정을 선택해야 합니다. 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>-->

CheckIfIsValidAccessCodeThrowIfIsNotValidAccessCode의 두 클레임 변환을 정의했습니다. CheckIfIsValidAccessCodeCompareClaimToValue 변환 메서드를 사용하여 사용자의 액세스 코드 입력을 정적 값 88888(테스트에 이 값을 사용)과 비교하고 true 또는 falseisValidAccessCode 클레임에 할당합니다. ThrowIfIsNotValidAccessCode는 두 클레임의 두 부울 값이 같은지 여부를 확인하고 같지 않은 경우 예외를 throw합니다.

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

    AccessCodeInputCollectorCheckAccessCodeViaClaimsTransformationChecker의 두 가지 기술 프로필을 구성했습니다. CheckAccessCodeViaClaimsTransformationChecker 기술 프로필을 AccessCodeInputCollector 기술 프로필 내에서 유효성 검사 기술 프로필로 호출합니다. CheckAccessCodeViaClaimsTransformationChecker 자체는 2단계에서 정의한 클레임 변환을 실행하는 클레임 변환 기술 프로필 유형입니다.

    AccessCodeInputCollector는 사용자의 액세스 코드를 수집하는 데 사용되는 자체 어설션 기술 프로필입니다. 여기에는 OnClaimsExistence로 설정된 EnabledForUserJourneys 요소가 포함됩니다. 해당 Metadata 요소에는 이 기술 프로필을 활성화하는 클레임(accountType) 및 해당 값(persnal)이 포함됩니다.

  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. DisplayClaims 컬렉션에서 accountType 표시 클레임 <DisplayClaim ClaimTypeReferenceId="accountType" Required="true"/>를 제거합니다.

    2. OutputClaims 컬렉션에서 accountType 출력 클레임 <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 요소를 사용하여 기술 프로필을 사용하거나 사용하지 않습니다. 또는 사용자 경험 오케스트레이션 단계 내에서 사전 조건을 사용하여 오케스트레이션 단계를 실행하거나 건너뛸 수 있습니다. 이 내용은 이 시리즈의 뒷부분에서 알아봅니다.

다음으로, 다음을 알아봅니다.