Azure Active Directory B2C 사용자 지정 정책을 사용하여 사용자 입력 유효성 검사

Azure AD B2C(Azure Active Directory B2C) 사용자 지정 정책을 사용하면 사용자 입력을 필수로 설정하고 유효성을 검사할 수 있습니다. 사용자 입력을 필수로 표시할 수 있지만(예: <DisplayClaim ClaimTypeReferenceId="givenName" Required="true"/>), 이것이 사용자가 유효한 데이터를 입력한다는 의미는 아닙니다. Azure AD B2C는 사용자 입력의 유효성을 검사하는 다양한 방법을 제공합니다. 이 문서에서는 다음 접근 방식을 사용하여 사용자 입력을 수집하고 유효성을 검사하는 사용자 지정 정책을 작성하는 방법을 알아봅니다.

  • 선택할 옵션 목록을 제공하여 사용자가 입력하는 데이터를 제한합니다. 이 접근 방식은 클레임을 선언할 때 추가하는 열거형 값을 사용합니다.

  • 사용자 입력이 일치해야 하는 패턴을 정의합니다. 이 접근 방식은 클레임을 선언할 때 추가하는 정규식을 사용합니다.

  • 규칙 집합을 정의하고 사용자 입력이 하나 이상의 규칙을 준수하도록 요구합니다. 이 접근 방식은 클레임을 선언할 때 추가하는 조건자를 사용합니다.

  • 특수 클레임 유형 reenterPassword를 사용하여 사용자가 사용자 입력 수집 중에 암호를 올바르게 다시 입력했는지 유효성을 검사합니다.

  • 클레임 선언 수준에서 정의할 수 없는 복잡한 비즈니스 규칙을 정의하는 유효성 검사 기술 프로필을 구성합니다. 예를 들어 다른 클레임의 값 또는 집합 값에 대해 유효성을 검사해야 하는 사용자 입력을 수집합니다.

필수 조건

참고 항목

이 문서는 Azure Active Directory B2C 방법 가이드 시리즈에서 사용자 고유의 사용자 지정 정책 만들기 및 실행의 일부입니다. 이 시리즈는 첫 번째 문서부터 시작하는 것이 좋습니다.

1단계 - 사용자 입력 옵션을 제한하여 사용자 입력 유효성 검사

사용자가 지정된 입력에 대해 입력할 수 있는 모든 가능한 값을 알고 있는 경우 사용자가 선택해야 하는 한정된 값 세트를 제공할 수 있습니다. 이 목적을 위해 DropdownSinglSelect, CheckboxMultiSelectRadioSingleSelectUserInputType을 사용할 수 있습니다. 이 문서에서는 RadioSingleSelect 입력 형식을 사용합니다.

  1. VS Code에서 ContosoCustomPolicy.XML 파일을 엽니다.

  2. ContosoCustomPolicy.XML 파일의 ClaimsSchema 요소에서 다음 클레임 유형을 선언합니다.

        <ClaimType Id="accountType">
            <DisplayName>Account Type</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>The type of account used by the user</UserHelpText>
            <UserInputType>RadioSingleSelect</UserInputType>
            <Restriction>
                <Enumeration Text="Contoso Employee Account" Value="work" SelectByDefault="true"/>
                <Enumeration Text="Personal Account" Value="personal" SelectByDefault="false"/>
            </Restriction>
        </ClaimType>
    

    accountType 클레임을 선언했습니다. 사용자의 클레임 값이 수집되면 사용자는 work 값으로 Contoso 직원 계정을 선택하고 personal 값으로 개인 계정을 선택해야 합니다.

    또한 Azure AD B2C를 사용하여 다양한 언어에 대한 정책을 수용하고 여러 언어에 대한 계정 유형 제한 사항을 제공할 수 있습니다. 자세한 내용은 사용자 특성 추가 문서에서 UI 지역화 문서를 확인하세요.

  3. Id="UserInformationCollector"를 사용하여 기술 프로필을 찾고 다음 코드를 사용하여 accountType 클레임을 표시 클레임으로 추가합니다.

        <DisplayClaim ClaimTypeReferenceId="accountType" Required="true"/>
    
  4. Id="UserInformationCollector"를 사용하는 기술 프로필에서 다음 코드를 사용하여 accountType 클레임을 출력 클레임으로 추가합니다.

        <OutputClaim ClaimTypeReferenceId="accountType"/>
    
  5. 액세스 토큰에 계정 유형 클레임을 포함하려면 RelyingParty 요소를 찾고 다음 코드를 사용하여 accountType 클레임을 토큰 클레임으로 추가합니다.

        <OutputClaim ClaimTypeReferenceId="accountType" />
    

2단계 - 정규식을 사용하여 사용자 입력 유효성 검사

모든 가능한 사용자 입력 값을 미리 알 수 없는 경우 사용자가 직접 데이터를 입력하도록 할 수 있습니다. 이 경우 정규식(regex) 또는 패턴을 사용하여 사용자 입력의 형식을 지정하는 방법을 지정할 수 있습니다. 예를 들어 메일에는 해당 텍스트의 어딘가에 at(@) 기호와 마침표(.)가 있어야 합니다.

클레임을 선언할 때 사용자 지정 정책을 사용하여 사용자 입력이 일치해야 하는 regex를 정의할 수 있습니다. 입력이 식과 일치하지 않는 경우 필요에 따라 사용자에게 표시되는 메시지를 제공할 수 있습니다.

  1. ClaimsSchema 요소를 찾고 다음 코드를 사용하여 email 클레임을 선언합니다.

        <ClaimType Id="email">
            <DisplayName>Email Address</DisplayName>
            <DataType>string</DataType>
            <DefaultPartnerClaimTypes>
                <Protocol Name="OpenIdConnect" PartnerClaimType="email"/>
            </DefaultPartnerClaimTypes>
            <UserHelpText>Your email address. </UserHelpText>
            <UserInputType>TextBox</UserInputType>
            <Restriction>
                <Pattern RegularExpression="^[a-zA-Z0-9.!#$%&amp;&apos;^_`{}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$" HelpText="Please enter a valid email address something like maurice@contoso.com"/>
            </Restriction>
        </ClaimType>
    
  2. Id="UserInformationCollector"를 사용하여 기술 프로필을 찾고 다음 코드를 사용하여 email 클레임을 표시 클레임으로 추가합니다.

        <DisplayClaim ClaimTypeReferenceId="email" Required="true"/>
    
  3. Id="UserInformationCollector"를 사용하는 기술 프로필에서 다음 코드를 사용하여 email 클레임을 출력 클레임으로 추가합니다.

        <OutputClaim ClaimTypeReferenceId="email"/>
    
  4. RelyingParty 요소를 찾고 다음 코드를 사용하여 email 클레임을 토큰 클레임으로 추가합니다.

        <OutputClaim ClaimTypeReferenceId="email" />
    

3단계 - 조건자를 사용하여 사용자 입력 유효성 검사

regex를 사용하여 사용자 입력의 유효성을 검사했습니다. 그러나 regex에는 한 가지 약점이 있습니다. 즉, 입력에 누락된 특정 요구 사항을 표시하지 않고 입력을 수정할 때까지 오류 메시지가 표시됩니다.

조건자 유효성 검사를 사용하여 각 규칙에 대한 규칙(조건자) 및 독립적인 오류 메시지 세트를 정의하도록 하면 이 문제를 해결할 수 있습니다. 사용자 지정 정책에서 조건자는 수행하려는 확인을 정의하는 기본 제공 메서드를 사용합니다. 예를 들어 IsLengthRange 조건자 메서드를 사용하여 사용자 암호가 지정된 최소 및 최대 매개 변수(값) 범위 내에 있는지 여부를 확인할 수 있습니다.

Predicates는 클레임 유형에 대해 확인할 유효성 검사를 정의하는 반면, PredicateValidations는 조건자 세트를 그룹화하여 클레임 유형에 적용할 수 있는 사용자 입력 유효성 검사를 구성합니다. 예를 들어 암호에 대한 다양한 유형의 허용 문자에 대한 유효성을 검사하는 유효성 검사의 조건자 그룹을 만듭니다. PredicatesPredicateValidations 요소는 모두 정책 파일 BuildingBlocks 섹션의 자식 요소입니다.

  1. ClaimsSchema 요소를 찾고 다음 코드를 사용하여 password 클레임을 선언합니다.

        <ClaimType Id="password">
          <DisplayName>Password</DisplayName>
          <DataType>string</DataType>
          <AdminHelpText>Enter password</AdminHelpText>
          <UserHelpText>Enter password</UserHelpText>
          <UserInputType>Password</UserInputType>
        </ClaimType>
    
  2. 다음 코드를 사용하여 Predicates 요소를 BuildingBlocks 섹션의 자식으로 추가합니다. ClaimsSchema 요소 아래에 Predicates 요소를 추가합니다.

        <Predicates>
    
        </Predicates>
    
  3. Predicates 요소 내에서 다음 코드를 사용하여 조건자를 정의합니다.

      <Predicate Id="IsLengthBetween8And64" Method="IsLengthRange" HelpText="The password must be between 8 and 64 characters.">
        <Parameters>
          <Parameter Id="Minimum">8</Parameter>
          <Parameter Id="Maximum">64</Parameter>
        </Parameters>
      </Predicate>
    
      <Predicate Id="Lowercase" Method="IncludesCharacters" HelpText="a lowercase letter">
        <Parameters>
          <Parameter Id="CharacterSet">a-z</Parameter>
        </Parameters>
      </Predicate>
    
      <Predicate Id="Uppercase" Method="IncludesCharacters" HelpText="an uppercase letter">
        <Parameters>
          <Parameter Id="CharacterSet">A-Z</Parameter>
        </Parameters>
      </Predicate>
    
      <Predicate Id="Number" Method="IncludesCharacters" HelpText="a digit">
        <Parameters>
          <Parameter Id="CharacterSet">0-9</Parameter>
        </Parameters>
      </Predicate>
    
      <Predicate Id="Symbol" Method="IncludesCharacters" HelpText="a symbol">
        <Parameters>
          <Parameter Id="CharacterSet">@#$%^&amp;*\-_+=[]{}|\\:',.?/`~"();!</Parameter>
        </Parameters>
      </Predicate>
    
      <Predicate Id="PIN" Method="MatchesRegex" HelpText="The password must be numbers only.">
        <Parameters>
          <Parameter Id="RegularExpression">^[0-9]+$</Parameter>
        </Parameters>
      </Predicate>
    
      <Predicate Id="AllowedCharacters" Method="MatchesRegex" HelpText="An invalid character was provided.">
        <Parameters>
          <Parameter Id="RegularExpression">(^([0-9A-Za-z\d@#$%^&amp;*\-_+=[\]{}|\\:',?/`~"();! ]|(\.(?!@)))+$)|(^$)</Parameter>
        </Parameters>
      </Predicate>
    
      <Predicate Id="DisallowedWhitespace" Method="MatchesRegex" HelpText="The password must not begin or end with a whitespace character.">
        <Parameters>
          <Parameter Id="RegularExpression">(^\S.*\S$)|(^\S+$)|(^$)</Parameter>
        </Parameters>
      </Predicate>
    

    여러 가지 규칙을 정의했고 이와 함께 허용되는 암호를 설명했습니다. 다음으로, 조건자를 그룹화하여 정책에 사용할 수 있는 암호 정책 세트를 구성할 수 있습니다.

  4. 다음 코드를 사용하여 PredicateValidations 요소를 BuildingBlocks 섹션의 자식으로 추가합니다. PredicateValidations 요소를 BuildingBlocks 섹션의 자식으로 추가하지만 Predicates 요소 아래에 추가합니다.

        <PredicateValidations>
    
        </PredicateValidations>
    
  5. PredicateValidations 요소 내에서 다음 코드를 사용하여 PredicateValidations를 정의합니다.

        <PredicateValidation Id="SimplePassword">
            <PredicateGroups>
                <PredicateGroup Id="DisallowedWhitespaceGroup">
                    <PredicateReferences>
                        <PredicateReference Id="DisallowedWhitespace"/>
                    </PredicateReferences>
                </PredicateGroup>
                <PredicateGroup Id="AllowedCharactersGroup">
                    <PredicateReferences>
                        <PredicateReference Id="AllowedCharacters"/>
                    </PredicateReferences>
                </PredicateGroup>
                <PredicateGroup Id="LengthGroup">
                    <PredicateReferences>
                        <PredicateReference Id="IsLengthBetween8And64"/>
                    </PredicateReferences>
                </PredicateGroup>
            </PredicateGroups>
        </PredicateValidation>
        <PredicateValidation Id="StrongPassword">
            <PredicateGroups>
                <PredicateGroup Id="DisallowedWhitespaceGroup">
                    <PredicateReferences>
                        <PredicateReference Id="DisallowedWhitespace"/>
                    </PredicateReferences>
                </PredicateGroup>
                <PredicateGroup Id="AllowedCharactersGroup">
                    <PredicateReferences>
                        <PredicateReference Id="AllowedCharacters"/>
                    </PredicateReferences>
                </PredicateGroup>
                <PredicateGroup Id="LengthGroup">
                    <PredicateReferences>
                        <PredicateReference Id="IsLengthBetween8And64"/>
                    </PredicateReferences>
                </PredicateGroup>
                <PredicateGroup Id="CharacterClasses">
                    <UserHelpText>The password must have at least 3 of the following:</UserHelpText>
                    <PredicateReferences MatchAtLeast="3">
                        <PredicateReference Id="Lowercase"/>
                        <PredicateReference Id="Uppercase"/>
                        <PredicateReference Id="Number"/>
                        <PredicateReference Id="Symbol"/>
                    </PredicateReferences>
                </PredicateGroup>
            </PredicateGroups>
        </PredicateValidation>
        <PredicateValidation Id="CustomPassword">
            <PredicateGroups>
                <PredicateGroup Id="DisallowedWhitespaceGroup">
                    <PredicateReferences>
                        <PredicateReference Id="DisallowedWhitespace"/>
                    </PredicateReferences>
                </PredicateGroup>
                <PredicateGroup Id="AllowedCharactersGroup">
                    <PredicateReferences>
                        <PredicateReference Id="AllowedCharacters"/>
                    </PredicateReferences>
                </PredicateGroup>
            </PredicateGroups>
        </PredicateValidation>
    

    세 가지 조건자 유효성 검사인 StrongPassword, CustomPasswordSimplePassword를 정의했습니다. 사용자가 입력하려는 암호의 특성에 따라 조건자 유효성 검사에서 사용할 수 있습니다. 이 문서에서는 강력한 암호를 사용합니다.

  6. password 클레임 유형 선언을 찾고 다음 코드를 사용하여 선언에 포함된 UserInputType 요소 선언 바로 뒤에 StrongPassword 조건자 유효성 검사를 추가합니다.

        <PredicateValidationReference Id="StrongPassword" />
    
  7. Id="UserInformationCollector"를 사용하여 기술 프로필을 찾고 다음 코드를 사용하여 password 클레임을 표시 클레임으로 추가합니다.

        <DisplayClaim ClaimTypeReferenceId="password" Required="true"/>
    
  8. Id="UserInformationCollector"를 사용하는 기술 프로필에서 다음 코드를 사용하여 password 클레임을 출력 클레임으로 추가합니다.

        <OutputClaim ClaimTypeReferenceId="password"/>
    

참고 항목

보안상 이유로 정책에서 생성된 토큰에서 사용자 암호를 클레임으로 추가하지 않습니다. 따라서 신뢰 당사자 요소에 암호 클레임을 추가하지 않습니다.

4단계 - 암호 유효성 검사 및 암호 확인

사용자가 입력한 암호를 기억하고 있는지 확인하기 위해 사용자에게 해당 암호를 두 번 입력하도록 요구할 수 있습니다. 이 경우 두 항목의 값이 일치하는지 확인해야 합니다. 사용자 지정 정책은 이 요구 사항을 쉽게 달성할 수 있는 방법을 제공합니다. 클레임 유형 passwordreenterPassword는 특수한 것으로 간주되므로 사용자 입력을 수집하는 데 사용되는 경우 UI는 사용자가 해당 암호를 올바르게 다시 입력했는지 유효성을 검사합니다.

다음 단계를 사용하여 사용자 지정 정책에서 암호 다시 입력의 유효성을 검사합니다.

  1. ContosoCustomPolicy.XML 파일의 ClaimsSchema 섹션에서 다음 코드를 사용하여 password 클레임 바로 뒤에 reenterPassword 클레임을 선언합니다.

        <ClaimType Id="reenterPassword">
            <DisplayName>Confirm new password</DisplayName>
            <DataType>string</DataType>
            <AdminHelpText>Confirm new password</AdminHelpText>
            <UserHelpText>Reenter password</UserHelpText>
            <UserInputType>Password</UserInputType>
        </ClaimType>    
    
  2. 사용자의 암호 확인 입력을 수집하려면 UserInformationCollector 자체 어설션 기술 프로필을 찾고 다음 코드를 사용하여 reenterPassword 클레임을 표시 클레임으로 추가합니다.

        <DisplayClaim ClaimTypeReferenceId="reenterPassword" Required="true"/>
    
  3. ContosoCustomPolicy.XML 파일에서 UserInformationCollector 자체 어설션 기술 프로필을 찾고 다음 코드를 사용하여 reenterPassword 클레임을 출력 클레임으로 추가합니다.

        <OutputClaim ClaimTypeReferenceId="reenterPassword"/>
    

5단계 - 사용자 지정 정책 파일 업로드

이제 사용자 입력 유효성 검사에 대한 처음 세 가지 접근 방식을 해결하는 정책을 빌드했습니다.

사용자 지정 정책 파일 업로드의 단계를 따릅니다. 이미 포털에 있는 파일과 이름이 같은 파일을 업로드하면 사용자 지정 정책이 이미 있는 경우 덮어쓰기를 선택해야 합니다.

6단계 - 사용자 지정 정책 테스트

  1. 사용자 지정 정책에서 B2C_1A_CONTOSOCUSTOMPOLICY를 선택합니다.

  2. 사용자 지정 정책의 개요 페이지에 있는 애플리케이션 선택에서 이전에 등록한 webapp1과 같은 웹 애플리케이션을 선택합니다. 회신 URL 선택 값이 https://jwt.ms로 설정되어 있는지 확인합니다.

  3. 지금 실행 단추를 선택합니다.

  4. 이름을 입력합니다.

  5. 계정 유형을 선택합니다.

  6. 메일 주소에는 형식이 올바르지 않은 메일 값을 입력합니다(예: maurice@contoso).

  7. 암호에는 설정된 강력한 암호의 모든 특성을 준수하지 않는 암호 값을 입력합니다.

  8. 계속 단추를 선택합니다. 다음과 같은 화면이 표시됩니다.

    screenshot of validating user inputs.

    계속하기 전에 입력을 수정해야 합니다.

  9. 오류 메시지에 제안된 대로 올바른 값을 입력한 다음, 계속 단추를 다시 선택합니다. 정책 실행이 완료되면 https://jwt.ms로 리디렉션되고 디코딩된 JWT 토큰이 표시됩니다. 토큰은 다음 JWT 토큰 코드 조각과 같이 표시됩니다.

    {
      "typ": "JWT",
      "alg": "RS256",
      "kid": "pxLOMWFg...."
    }.{
      ...
      "sub": "c7ae4515-f7a7....",
      ...
      "acr": "b2c_1a_contosocustompolicy",
      "accountType": "work",
      ...
      "email": "maurice@contoso.com",
      "name": "Maurice Paulet",
      "message": "Hello Maurice Paulet"
    }.[Signature]

7단계 - 유효성 검사 기술 프로필을 사용하여 사용자 입력 유효성 검사

1단계, 2단계 및 3단계에서 사용한 유효성 검사 기술이 모든 시나리오에 적용되는 것은 아닙니다. 클레임 선언 수준에서 비즈니스 규칙을 정의하는 것이 너무 복잡하다면 유효성 검사 기술을 구성한 다음, 자체 어설션 기술 프로필에서 호출할 수 있습니다.

참고 항목

자체 어설션된 기술 프로필만 유효성 검사 기술 프로필을 사용할 수 있습니다. 유효성 검사 기술 프로필에 관한 자세한 정보

시나리오 개요

사용자의 계정 유형이 Contoso 직원 계정인 경우 메일 도메인이 미리 정의된 도메인 세트를 기반으로 하는지 확인해야 합니다. 이 도메인은 contoso.com, fabrikam.comwoodgrove.com입니다. 그렇지 않으면 유효한 Contoso 직원 계정을 사용하거나 개인 계정으로 전환할 때까지 사용자에게 오류가 표시됩니다.

다음 단계를 사용하여 유효성 검사 기술 프로필을 통해 사용자 입력의 유효성을 검사하는 방법을 알아봅니다. 클레임 변환 유형 유효성 검사 기술 프로필을 사용하지만, REST API 서비스를 호출하여 데이터의 유효성을 검사할 수도 있습니다. 이 내용은 이 시리즈의 뒷부분에서 알아봅니다.

  1. ContosoCustomPolicy.XML 파일의 ClaimsSchema 섹션에서 다음 코드를 사용하여 domaindomainStatus 클레임을 선언합니다.

        <ClaimType Id="domain">
          <DataType>string</DataType>
        </ClaimType>
    
        <ClaimType Id="domainStatus">
          <DataType>string</DataType>
        </ClaimType>
    
  2. ClaimsTransformations 섹션을 찾고 다음 코드를 사용하여 클레임 변환을 구성합니다.

        <ClaimsTransformation Id="GetDomainFromEmail" TransformationMethod="ParseDomain">
            <InputClaims>
                <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="emailAddress"/>
            </InputClaims>
            <OutputClaims>
                <OutputClaim ClaimTypeReferenceId="domain" TransformationClaimType="domain"/>
            </OutputClaims>
        </ClaimsTransformation>
        <ClaimsTransformation Id="LookupDomain" TransformationMethod="LookupValue">
            <InputClaims>
                <InputClaim ClaimTypeReferenceId="domain" TransformationClaimType="inputParameterId"/>
            </InputClaims>
            <InputParameters>
                <InputParameter Id="contoso.com" DataType="string" Value="valid"/>
                <InputParameter Id="fabrikam.com" DataType="string" Value="valid"/>
                <InputParameter Id="woodgrove.com" DataType="string" Value="valid"/>
                <InputParameter Id="errorOnFailedLookup" DataType="boolean" Value="true"/>
            </InputParameters>
            <OutputClaims>
                <OutputClaim ClaimTypeReferenceId="domainStatus" TransformationClaimType="outputClaim"/>
            </OutputClaims>
        </ClaimsTransformation>
    

    GetDomainFromEmail 클레임 변환은 ParseDomain 메서드를 사용하여 메일에서 도메인을 추출하고 domain 클레임에 저장합니다. LookupDomain 클레임 변환은 추출된 도메인을 사용하여 미리 정의된 도메인에서 조회하고 domainStatus 클레임에 valid를 할당하여 유효한지 확인합니다.

  3. 다음 코드를 사용하여 Id=UserInformationCollector를 통해 기술 프로필과 동일한 클레임 공급자의 기술 프로필을 추가합니다.

        <TechnicalProfile Id="CheckCompanyDomain">
            <DisplayName>Check Company validity </DisplayName>
            <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            <InputClaimsTransformations>
                <InputClaimsTransformation ReferenceId="GetDomainFromEmail"/>
            </InputClaimsTransformations>
            <OutputClaims>
                <OutputClaim ClaimTypeReferenceId="domain"/>
            </OutputClaims>
            <OutputClaimsTransformations>
                <OutputClaimsTransformation ReferenceId="LookupDomain"/>
            </OutputClaimsTransformations>
        </TechnicalProfile>
    

    GetDomainFromEmailLookupDomain 클레임 변환을 실행하는 클레임 변환 기술 프로필을 선언했습니다.

  4. Id=UserInformationCollector를 사용하여 기술 프로필을 찾고 다음 코드를 사용하여 OutputClaims 요소 바로 뒤에 ValidationTechnicalProfile을 추가합니다.

        <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="CheckCompanyDomain">
                <Preconditions>
                    <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
                        <Value>accountType</Value>
                        <Value>work</Value>
                        <Action>SkipThisValidationTechnicalProfile</Action>
                    </Precondition>
                </Preconditions>
            </ValidationTechnicalProfile>
        </ValidationTechnicalProfiles>
    

    UserInformationCollector 자체 어설션 기술 프로필에 유효성 검사 기술 프로필을 추가했습니다. accountType 값이 work와 같지 않은 경우에만 기술 프로필을 건너뜁니다. 기술 프로필이 실행되고 메일 도메인이 유효하지 않으면 오류가 throw됩니다.

  5. Id=UserInformationCollector를 사용하여 기술 프로필을 찾고 metadata 태그 내에 다음 코드를 추가합니다.

        <Item Key="LookupNotFound">The provided email address isn't a valid Contoso Employee email.</Item>
    

    사용자가 유효한 메일을 사용하지 않는 경우 사용자 지정 오류를 설정했습니다.

  6. 사용자 지정 정책 파일 업로드의 지침에 따라 정책 파일을 업로드합니다.

  7. 6단계의 지침에 따라 사용자 지정 정책을 테스트합니다.

    1. 계정 유형에서 Contoso 직원 계정을 선택합니다.
    2. 메일 주소에는 잘못된 메일 주소를 입력합니다(예: maurice@fourthcoffee.com).
    3. 필요에 따라 나머지 세부 정보를 입력하고 계속을 선택합니다.

    maurice@fourthcoffee.com이 유효한 메일이 아니므로 아래 스크린샷과 같은 오류가 표시됩니다. 성공적으로 사용자 지정 정책을 실행하고 JWT 토큰을 받으려면 유효한 메일 주소를 사용해야 합니다.

    screenshot of error due to invalid email address.

다음 단계