다음을 통해 공유


Azure Active Directory B2C 사용자 지정 정책을 사용하여 로컬 계정에 대한 등록 및 로그인 흐름 설정

Azure Active Directory B2C 사용자 지정 정책을 사용하여 사용자 계정 만들기 및 읽기 문서에서 사용자가 새 사용자 계정을 만들지만 로그인하지 않습니다.

이 문서에서는 사용자가 Azure AD B2C 로컬 계정을 만들거나 계정에 로그인하도록 허용하는 Azure AD B2C(Azure Active Directory B2C) 사용자 지정 정책을 작성하는 방법을 알아봅니다. 로컬 계정은 사용자가 애플리케이션에 등록할 때 Azure AD B2C 테넌트에서 만들어지는 계정을 나타냅니다.

개요

Azure AD B2C는 OpenID Connect 인증 프로토콜을 사용하여 사용자 자격 증명을 확인합니다. Azure AD B2C에서 다른 정보와 함께 사용자 자격 증명을 보안 엔드포인트로 보낸 다음 자격 증명이 유효한지 여부를 결정합니다. 간단히 말해서 Azure AD B2C의 OpenID Connect 구현을 사용하면 웹 애플리케이션의 등록, 로그인 및 기타 ID 관리 환경을 Microsoft Entra ID로 아웃소싱할 수 있습니다.

Azure AD B2C 사용자 지정 정책은 안전한 Microsoft 엔드포인트를 호출하는 데 사용하는 OpenID Connect 기술 프로필을 제공합니다. OpenID Connect 기술 프로필에 대해 자세히 알아봅니다.

필수 조건

참고 항목

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

1단계 - OpenID Connect 기술 프로필 구성

OpenID Connect 기술 프로필을 구성하려면 다음 세 단계를 수행해야 합니다.

  • 더 많은 클레임을 선언합니다.
  • Azure Portal에 앱을 등록합니다.
  • 마지막으로 OpenID Connect 기술 프로필 자체를 구성합니다.

1.1단계 - 추가 클레임 선언

ContosoCustomPolicy.XML 파일에서 ClaimsSchema 섹션을 찾은 후 다음 코드를 사용하여 더 많은 클레임을 추가합니다.

    <!--<ClaimsSchema>-->
        ...
        <ClaimType Id="grant_type">
            <DisplayName>grant_type</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Special parameter passed for local account authentication to login.microsoftonline.com.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="scope">
            <DisplayName>scope</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Special parameter passed for local account authentication to login.microsoftonline.com.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="nca">
            <DisplayName>nca</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Special parameter passed for local account authentication to login.microsoftonline.com.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="client_id">
            <DisplayName>client_id</DisplayName>
            <DataType>string</DataType>
            <AdminHelpText>Special parameter passed to EvoSTS.</AdminHelpText>
            <UserHelpText>Special parameter passed to EvoSTS.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="resource_id">
            <DisplayName>resource_id</DisplayName>
            <DataType>string</DataType>
            <AdminHelpText>Special parameter passed to EvoSTS.</AdminHelpText>
            <UserHelpText>Special parameter passed to EvoSTS.</UserHelpText>
        </ClaimType>
    <!--</ClaimsSchema>-->

1.2단계 - Identity Experience Framework 애플리케이션 등록

Azure AD B2C를 사용하려면 로컬 계정으로 사용자를 가입하고 로그인하는 데 사용하는 두 개의 애플리케이션인 IdentityExperienceFramework, 웹 API 및 IdentityExperienceFramework 앱에 위임된 권한이 있는 네이티브 앱인 ProxyIdentityExperienceFramework를 등록해야 합니다.

아직 등록하지 않은 경우 다음 애플리케이션을 등록합니다. 아래 연습을 자동화하려면 IEF 설치 앱을 방문하여 지침을 따르세요.

  1. IdentityExperienceFramework 애플리케이션 등록의 단계에서 Identity Experience Framework 애플리케이션을 등록합니다. 다음 단계에서 사용할 Identity Experience Framework 애플리케이션 등록을 위한 애플리케이션(클라이언트) ID, appID를 복사합니다.

  2. ProxyIdentityExperienceFramework 애플리케이션 등록의 단계에서 프록시 Identity Experience Framework 애플리케이션을 등록합니다. 다음 단계에서 사용할 수 있도록 프록시 Identity Experience Framework 애플리케이션 등록을 위한 애플리케이션(클라이언트) ID, proxyAppID를 복사합니다.

1.3단계 - OpenID Connect 기술 프로필 구성

ContosoCustomPolicy.XML 파일에서 ClaimsProviders 섹션을 찾은 후 다음 코드를 사용하여 OpenID Connect 기술 프로필을 보유하는 클레임 공급자 요소를 추가합니다.

    <!--<ClaimsProviders>-->
        ...
        <ClaimsProvider>
            <DisplayName>OpenID Connect Technical Profiles</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="SignInUser">
                    <DisplayName>Sign in with Local Account</DisplayName>
                    <Protocol Name="OpenIdConnect" />
                    <Metadata>
                        <Item Key="UserMessageIfClaimsPrincipalDoesNotExist">We didn't find this account</Item>
                        <Item Key="UserMessageIfInvalidPassword">Your password or username is incorrect</Item>
                        <Item Key="UserMessageIfOldPasswordUsed">You've used an old password.</Item>
                        <Item Key="ProviderName">https://sts.windows.net/</Item>
                        <Item Key="METADATA">https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration</Item>
                        <Item Key="authorization_endpoint">https://login.microsoftonline.com/{tenant}/oauth2/token</Item>
                        <Item Key="response_types">id_token</Item>
                        <Item Key="response_mode">query</Item>
                        <Item Key="scope">email openid</Item>
                        <!-- Policy Engine Clients -->
                        <Item Key="UsePolicyInRedirectUri">false</Item>
                        <Item Key="HttpBinding">POST</Item>
                        <Item Key="client_id">proxyAppID</Item>
                        <Item Key="IdTokenAudience">appID</Item>
                    </Metadata>
                    <InputClaims>
                        <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="username" Required="true" />
                        <InputClaim ClaimTypeReferenceId="password" PartnerClaimType="password" Required="true" />
                        <InputClaim ClaimTypeReferenceId="grant_type" DefaultValue="password" />
                        <InputClaim ClaimTypeReferenceId="scope" DefaultValue="openid" />
                        <InputClaim ClaimTypeReferenceId="nca" PartnerClaimType="nca" DefaultValue="1" />
                        <InputClaim ClaimTypeReferenceId="client_id" DefaultValue="proxyAppID" />
                        <InputClaim ClaimTypeReferenceId="resource_id" PartnerClaimType="resource" DefaultValue="appID" />
                    </InputClaims>
                    <OutputClaims>
                        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid" />
                    </OutputClaims>
                </TechnicalProfile>
            </TechnicalProfiles>
        </ClaimsProvider>
    <!--</ClaimsProviders>-->

다음의 두 인스턴스를 모두 바꿉니다.

  • appID1.2단계에서 복사한 Identity Experience Framework 애플리케이션의 애플리케이션(클라이언트) ID로 바꿉니다.

  • proxyAppID1.2단계에서 복사한 프록시 Identity Experience Framework 애플리케이션의 애플리케이션(클라이언트) ID로 바꿉니다.

2단계 - 로그인 사용자 인터페이스 구성

정책이 실행되면 사용자는 로그인할 수 있는 사용자 인터페이스를 확인해야 합니다. 사용자 인터페이스에는 아직 계정이 없는 경우 등록할 수 있는 옵션도 있습니다. 이렇게 하려면 다음 두 단계를 수행해야 합니다.

  • 사용자에게 로그인 양식을 표시하는 자체 어설션 기술 프로필을 구성합니다.
  • 로그인 사용자 인터페이스에 대한 콘텐츠 정의를 구성합니다.

2.1단계 - 로그인 사용자 인터페이스 기술 프로필 구성

ContosoCustomPolicy.XML 파일에서 SignInUser 기술 프로필을 찾고 다음 코드를 사용하여 그 뒤에 SelfAsserted 기술 프로필을 추가합니다.

    <TechnicalProfile Id="UserSignInCollector">
        <DisplayName>Local Account Signin</DisplayName>
        <Protocol Name="Proprietary"
            Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
            <Item Key="setting.operatingMode">Email</Item>
            <Item Key="SignUpTarget">AccountTypeInputCollectorClaimsExchange</Item>
        </Metadata>
        <DisplayClaims>
            <DisplayClaim ClaimTypeReferenceId="email" Required="true" />
            <DisplayClaim ClaimTypeReferenceId="password" Required="true" />
        </DisplayClaims>
        <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="email" />
            <OutputClaim ClaimTypeReferenceId="password"  />
            <OutputClaim ClaimTypeReferenceId="objectId" />
        </OutputClaims>
        <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="SignInUser" />
        </ValidationTechnicalProfiles>
    </TechnicalProfile>

사용자에게 로그인 양식을 표시하는 SelfAsserted 기술 프로필인 UserSignInCollector를 추가했습니다. setting.operatingMode 메타데이터에 표시된 대로 사용자의 이메일 주소를 로그인 이름으로 수집하도록 기술 프로필을 구성했습니다. 로그인 양식에는 SignUpTarget 메타데이터에 표시된 등록 양식으로 사용자를 안내하는 등록 링크가 포함되어 있습니다. 오케스트레이션 단계에서 SignUpWithLogonEmailExchangeClaimsExchange를 설정하는 방법을 확인할 수 있습니다.

또한 SignInUser OpenID Connect 기술 프로필을 ValidationTechnicalProfile로 추가했습니다. 따라서 사용자가 로그인 단추를 선택하면 SignInUser 기술 프로필이 실행됩니다(5단계의 스크린샷 참조).

다음 단계(2.2단계)에서는 이 SelfAsserted 기술 프로필에서 사용할 콘텐츠 정의를 구성합니다.

2.2단계 - 로그인 인터페이스 콘텐츠 정의 구성

ContosoCustomPolicy.XML 파일에서 ContentDefinitions 섹션을 찾은 후 다음 코드를 사용하여 콘텐츠 정의에 로그인합니다.

    <!--<ContentDefinitions>-->
        ...
            <ContentDefinition Id="SignupOrSigninContentDefinition">
                <LoadUri>~/tenant/templates/AzureBlue/unified.cshtml</LoadUri>
                <RecoveryUri>~/common/default_page_error.html</RecoveryUri>
                <DataUri>urn:com:microsoft:aad:b2c:elements:contract:unifiedssp:2.1.7</DataUri>
                <Metadata>
                    <Item Key="DisplayName">Signin and Signup</Item>
                </Metadata>
            </ContentDefinition>
    <!--</ContentDefinitions>-->

자체 어설션 기술 프로필 SignupOrSigninContentDefinition에 대한 콘텐츠 정의를 구성했습니다. 메타데이터 요소를 사용하여 기술 프로필에서 지정하거나 오케스트레이션 단계에서 기술 프로필을 참조할 때 지정할 수 있습니다. 이전에는 자체 어설션 기술 프로필에서 콘텐츠 정의를 직접 지정하는 방법을 배웠으므로 이 문서에서는 오케스트레이션 단계인 3단계에서 기술 프로필을 참조할 때 이를 지정하는 방법을 알아봅니다.

3단계 - 사용자 경험 오케스트레이션 단계 업데이트

ContosoCustomPolicy.XML 파일에서 HelloWorldJourney 사용자 경험을 찾아 모든 오케스트레이션 단계 컬렉션을 다음 코드로 바꿉니다.

    <!--<OrchestrationSteps>-->
        ...
        <OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="SignupOrSigninContentDefinition">
            <ClaimsProviderSelections>
                <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" />
            </ClaimsProviderSelections>
            <ClaimsExchanges>
                <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="UserSignInCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="2" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="AccountTypeInputCollectorClaimsExchange" TechnicalProfileReferenceId="AccountTypeInputCollector"/>
            </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="3" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                  <Value>accountType</Value>
                  <Value>company</Value>
                  <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="GetAccessCodeClaimsExchange" TechnicalProfileReferenceId="AccessCodeInputCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>
        
        <OrchestrationStep Order="4" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="SignUpWithLogonEmailExchange" TechnicalProfileReferenceId="UserInformationCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>  
      
        <OrchestrationStep Order="5" Type="ClaimsExchange">
            <ClaimsExchanges>
            <ClaimsExchange Id="AADUserReaderExchange" TechnicalProfileReferenceId="AAD-UserRead"/>
            </ClaimsExchanges>
        </OrchestrationStep>                
        
        <OrchestrationStep Order="6" Type="ClaimsExchange">
            <ClaimsExchanges>
            <ClaimsExchange Id="GetMessageClaimsExchange" TechnicalProfileReferenceId="UserInputMessageClaimGenerator"/>
            </ClaimsExchanges>          
        </OrchestrationStep>                
        
        <OrchestrationStep Order="7" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
    <!--</OrchestrationSteps>-->

오케스트레이션 2~5단계에서 사전 조건을 사용하여 오케스트레이션 단계를 실행해야 하는지 결정했습니다. 사용자가 로그인 또는 등록 중인지 확인해야 합니다.

사용자 지정 정책이 실행되는 경우:

  • 오케스트레이션 1단계 - 사용자가 로그인하거나 지금 등록 링크를 선택할 수 있도록 로그인 페이지를 표시합니다. UserSignInCollector 자체 어설션 기술 프로필이 로그인 양식을 표시하는 데 사용하는 콘텐츠 정의를 지정합니다.

  • 오케스트레이션 2단계 - 이 단계에서는 사용자가 가입한 경우(objectId가 존재하지 않음) 실행되므로 AccountTypeInputCollector 자체 어설션 기술 프로필을 호출하여 계정 유형 선택 양식을 표시합니다.

  • 오케스트레이션 3단계 - 이 단계에서는 사용자가 가입하고(objectId가 존재하지 않음) 사용자가 accountType 회사를 선택하지 않은 경우 실행됩니다. 따라서 AccessCodeInputCollector 자체 어설션 기술 프로필을 호출하여 사용자에게 accessCode를 입력하도록 요청해야 합니다.

  • 오케스트레이션 4단계 - 이 단계에서는 사용자가 등록한 경우(objectId가 존재하지 않음) 실행되므로 UserInformationCollector 자체 어설션 기술 프로필을 호출하여 등록 양식을 표시합니다.

  • 오케스트레이션 5단계 - 이 단계에서는 Microsoft Entra ID(AAD-UserRead Microsoft Entra ID 기술 프로필 호출)에서 계정 정보를 읽어 사용자가 가입하든 로그인하든 실행됩니다.

  • 오케스트레이션 6단계 - 이 단계에서는 UserInputMessageClaimGenerator 기술 프로필을 호출하여 사용자의 인사말 메시지를 조합합니다.

  • 오케스트레이션 7단계 - 마지막으로 8단계는 정책 실행이 끝날 때 JWT 토큰을 조합하고 반환합니다.

4단계 - 정책 업로드

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

5단계 - 테스트 정책

사용자 지정 정책을 테스트하려면 사용자 지정 정책 테스트의 단계를 따릅니다. 정책이 실행되면 아래 스크린샷과 유사한 인터페이스가 표시됩니다.

screenshot of sign-up or sign-in interface.

기존 계정의 이메일 주소암호를 입력하여 로그인할 수 있습니다. 아직 계정이 없는 경우 지금 등록 링크를 선택하여 새 사용자 계정을 만들어야 합니다.

다음 단계