지역 기반 구성에 대한 Azure Active Directory B2C 글로벌 ID 프레임워크 개념 증명

다음 섹션에서는 지역 기반 오케스트레이션에 대한 개념 증명 구현을 만드는 방법을 설명합니다. 완료된 Azure AD B2C(Azure Active Directory B2C) 사용자 지정 정책은 여기에서 찾을 수 있습니다.

지역 기반 방식

각 지역 Azure AD B2C 테넌트에는 다음 기능이 포함된 Azure AD B2C 사용자 지정 정책이 필요합니다.

등록 과정:

  • 사용자의 사용자 이름, 암호 및 기타 특성을 수집하는 화면 표시
  • 사용자-지역 매핑 테이블을 쿼리하여 사용자가 이미 존재하는 경우 등록 방지
  • 로컬 테넌트에 사용자 프로필 쓰기
  • 사용자 이름-지역 매핑을 매핑 테이블에 작성합니다.
  • 애플리케이션에 토큰 발급

로그인 과정:

  • 사용자 이름 및 암호 화면 표시
  • 사용자 이름 조회를 수행하고 해당 지역을 반환합니다.
  • 로컬 자격 증명 확인 또는 교차 테넌트 자격 증명 확인 수행
  • 로컬 테넌트에서 또는 테넌트 간 호출을 통해 사용자 프로필을 읽습니다.
  • 애플리케이션에 토큰 발급

암호 재설정 과정:

  • 이메일 OTP를 통해 사용자 이메일의 유효성을 검사하는 화면 표시
  • 사용자 이름 조회를 수행하고 해당 지역을 반환합니다.
  • 새 암호를 캡처하는 화면 표시
  • 로컬 테넌트에 새 암호를 쓰거나 테넌트 간 호출을 통해 씁니다.
  • 애플리케이션에 토큰 발급

다음 블록 다이어그램은 개념 증명을 보여 줍니다. 지침은 Azure AD B2C 테넌트를 구성하는 방법을 보여 줍니다. 외부 API 계층 및 Geo 분산 조회 테이블은 이 가이드의 일부로 포함되지 않습니다.

Screenshot shows the regional-based approach block diagram

필수 조건

  1. 비즈니스에서 지원해야 하는 지역별로 테넌트를 만듭니다. 이 개념 증명에는 두 개 이상의 테넌트가 필요합니다.

  2. 테넌트에 사용자 지정 정책을 배포합니다.

스토리지 계층 준비

사용자 이메일, objectId 및 지역을 저장할 수 있는 스토리지 계층이 필요합니다. 이렇게 하면 사용자가 가입한 위치를 추적하고 쿼리할 수 있습니다. Azure Storage 테이블을 사용하여 이 데이터를 유지할 수 있습니다.

API 계층 준비

지역 기반 방식을 시연하기 위해 개념 증명의 일부로 사용되는 여러 API가 있습니다.

사용자가 이미 존재하는지 확인

사용자가 이미 어떤 지역에 존재하는지 확인하기 위해 등록하는 동안 API가 사용됩니다.

요청은 다음과 같습니다.

POST /doesUserExistInLookupTable HTTP/1.1
Host: yourapi.com
Content-Type: application/json

{
  email: bob@contoso.com
}

  • 사용자가 존재하지 않는 경우 응답은 HTTP 200이어야 합니다.

  • 사용자가 존재하는 경우 응답은 HTTP 409여야 합니다.

사용자 지역 매핑 기록

API는 등록 중에 사용자가 등록한 지역을 기록하는 데 사용됩니다.

요청은 다음과 같습니다.

POST /userToRegionLookup HTTP/1.1
Host: yourapi.com
Authorization Bearer: <token>
Content-Type: application/json

{
  "email": "bob@contoso.com"
}

  • 사용자가 존재하는 경우 응답은 HTTP 200이어야 합니다.

  • 사용자가 존재하는 경우 응답은 HTTP 409여야 합니다.

사용자가 존재하는 지역 반환

사용자가 가입한 지역을 확인하기 위해 로그인하는 동안 API가 사용됩니다. 테넌트 간 인증을 수행해야 하는지 여부를 나타냅니다.

요청은 다음과 같습니다.

POST /userToRegionLookup HTTP/1.1
Host: yourapi.com
Authorization Bearer: <token>
Content-Type: application/json

{
  "email": "bob@contoso.com"
}

응답은 사용자 등록 지역 및 objectId가 포함된 HTTP 200이어야 합니다.

{
  "objectId": "460f9ffb-8b6b-458d-a5a4-b8f3a6816fc2",
  "region": "APAC"  
}

사용자가 존재하지 않거나 오류가 발생하면 API는 HTTP 409로 응답해야 합니다.

테넌트 전체에서 암호 쓰기

API는 암호 재설정 흐름 중에 사용자가 암호를 초기화한 다른 지역에서 사용자에게 새 암호를 기록하는 데 사용됩니다.

요청은 다음과 같습니다.

POST /writePasswordCrossTenant HTTP/1.1
Host: yourapi.com
Authorization Bearer: <token>
Content-Type: application/json

{
  "objectId": "460f9ffb-8b6b-458d-a5a4-b8f3a6816fc2",
  "password": "some!strong123STRING"
}

응답은 프로세스가 성공하면 HTTP 200, 오류가 있으면 HTTP 409여야 합니다.

지역 기반 Azure AD B2C 구성

다음 섹션에서는 사용자가 등록한 지역을 추적하고 필요한 경우 테넌트 간 인증 또는 암호 재설정을 수행하도록 Azure AD B2C 테넌트를 준비합니다.

사용자 지정 정책 구성 등록

등록하는 동안 사용자가 다른 테넌트에 존재하지 않는지 확인하고 사용자 지역 매핑을 외부 테이블에 작성해야 합니다.

Azure AD B2C 시작 팩에서 LocalAccountSignUpWithLogonEmail 기술 프로필을 다음과 같이 수정합니다.

<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
...
  <ValidationTechnicalProfiles>            
    <ValidationTechnicalProfile ReferenceId="REST-getTokenforExternalApiCalls" />
    <ValidationTechnicalProfile ReferenceId="REST-doesUserExistInLookupTable" />        
    <ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail" />
    <ValidationTechnicalProfile ReferenceId="REST-writeUserToRegionMapping" />
  </ValidationTechnicalProfiles>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>

ValidationTechnicalProfiles는 다음 논리를 수행합니다.

  1. REST-getTokenforExternalApiCalls 기술 프로필을 사용하여 보호된 API 엔드포인트를 호출하기 위한 토큰을 가져옵니다.

    • Microsoft Entra 전달자 토큰을 사용하여 API를 가져오고 보호하려면 여기 설명서를 따릅니다.
  2. 보안 외부 REST API 엔드포인트를 통해 사용자가 사용자-지역 매핑에 이미 있는지 확인합니다.

    • 이 API 호출은 모든 등록 전에 이루어지며 이 API에 가동 시간 요구 사항을 유지하기 위한 적절한 부하 분산, 복원력 및 장애 조치(failover) 메커니즘이 있는지 확인하는 것이 중요합니다.

    • 외부 REST API를 통해 사용자-지역 매핑을 쿼리하는 기술 프로필의 예는 다음과 같습니다.

      <TechnicalProfile Id="REST-doesUserExistInLookupTable ">
      <DisplayName>User to Region lookup</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="ServiceUrl">https://myApi.com/doesUserExistInLookupTable</Item>
        <Item Key="AuthenticationType">Bearer</Item>
        <Item Key="UseClaimAsBearerToken">ext_Api_bearerToken</Item>
        <Item Key="SendClaimsIn">Body</Item>
        <Item Key="AllowInsecureAuthInProduction">false</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="ext_Api_bearerToken" />
        <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email" />
      </InputClaims>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
      </TechnicalProfile>
      
    • 이 API는 사용자가 존재하는 경우 HTTP 409로 응답해야 하며 적절한 오류 메시지가 화면에 표시되어야 합니다. 그렇지 않고 사용자가 없으면 HTTP 200으로 응답합니다.

  3. 보안 외부 REST API 엔드포인트를 통해 사용자-지역 매핑 작성

    • 이 API 호출은 모든 등록 전에 이루어지며 이 API에 가동 시간 요구 사항을 유지하기 위한 적절한 부하 분산, 복원력 및 장애 조치(failover) 메커니즘이 있는지 확인하는 것이 중요합니다.

    • 외부 REST API를 통해 사용자-지역 매핑을 작성하기 위한 기술 프로필의 예는 다음과 같습니다.

    <TechnicalProfile Id="REST-writeUserToRegionMapping">
    <DisplayName>User to Region lookup</DisplayName>
    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    <Metadata>
      <Item Key="ServiceUrl">https://myApi.com/writeUserToRegionMapping</Item>
      <Item Key="AuthenticationType">Bearer</Item>
      <Item Key="UseClaimAsBearerToken">ext_Api_bearerToken</Item>
      <Item Key="SendClaimsIn">Body</Item>
      <Item Key="AllowInsecureAuthInProduction">false</Item>
    </Metadata>
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="ext_Api_bearerToken" />
      <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email" />
      <InputClaim ClaimTypeReferenceId="region" DefaultValue="EMEA" />
      <InputClaim ClaimTypeReferenceId="objectId" />
    </InputClaims>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
    </TechnicalProfile>
    ``` 
    
    

로그인 사용자 지정 정책 구성

로그인하는 동안 사용자 프로필 위치를 확인하고 해당 프로필이 있는 Azure AD B2C 테넌트에 대해 인증해야 합니다.

Azure AD B2C 시작 팩에서 SelfAsserted-LocalAccountSignin-Email 기술 프로필을 수정하여 사용자 지역 조회를 수행하고, 사용자가 도달한 테넌트의 지역과 다른 지역에 있는 경우 테넌트 간 인증을 수행합니다. ValidationTechnicalProfiles를 다음과 같이 업데이트합니다.

<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email">
...
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="REST-getTokenforExternalApiCalls" />
    <ValidationTechnicalProfile ReferenceId="REST-regionLookup" />
    <ValidationTechnicalProfile ReferenceId="login-NonInteractive">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
          <Value>user_region</Value>
          <Value>EMEA</Value>
          <Action>SkipThisValidationTechnicalProfile</Action>
        </Precondition>
      </Preconditions>
     <ValidationTechnicalProfile ReferenceId="REST-login-NonInteractive-APAC">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
          <Value>user_region</Value>
          <Value>APAC</Value>
          <Action>SkipThisValidationTechnicalProfile</Action>
        </Precondition>
      </Preconditions>
    </ValidationTechnicalProfile>
    <ValidationTechnicalProfile ReferenceId="REST-fetchUserProfile-APAC">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
          <Value>user_region</Value>
          <Value>APAC</Value>
          <Action>SkipThisValidationTechnicalProfile</Action>
        </Precondition>
      </Preconditions>
    </ValidationTechnicalProfile>
  </ValidationTechnicalProfiles>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>

ValidationTechnicalProfiles는 사용자가 자격 증명을 제출할 때 다음 논리를 수행합니다.

  1. REST-getTokenforExternalApiCalls 기술 프로필을 사용하여 보호된 API 엔드포인트를 호출하기 위한 토큰을 가져옵니다.

    • Microsoft Entra 전달자 토큰을 사용하여 API를 가져오고 보호하려면 여기 설명서를 따릅니다.
  2. 보안 외부 REST API 엔드포인트를 통해 사용자-지역 매핑 조회

    • 이 API 호출은 모든 등록 전에 이루어지며 이 API에 가동 시간 요구 사항을 유지하기 위한 적절한 부하 분산, 복원력 및 장애 조치(failover) 메커니즘이 있는지 확인하는 것이 중요합니다.

    • 외부 REST API를 통해 사용자-지역 매핑을 쿼리하는 기술 프로필의 예는 다음과 같습니다.

      <TechnicalProfile Id="REST-regionLookup">
        <DisplayName>User to Region lookup</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
          <Item Key="ServiceUrl">https://myApi.com/userToRegionLookup</Item>
          <Item Key="AuthenticationType">Bearer</Item>
          <Item Key="UseClaimAsBearerToken">ext_Api_bearerToken</Item>
          <Item Key="SendClaimsIn">Body</Item>
          <Item Key="AllowInsecureAuthInProduction">false</Item>
        </Metadata>
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="ext_Api_bearerToken" />
          <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email" />
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="user_region" PartnerClaimType="region" />
          <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="objectId" />
        </OutputClaims>
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
      </TechnicalProfile>
      
  3. 이 테넌트에 등록한 사용자의 login-NonInteractive 기술 프로필을 통해 로컬 계정 인증을 수행합니다. Azure AD B2C 시작 팩에 있는 기본 기술 프로필입니다.

  4. 조건부로 각 지역의 REST-login-NonInteractive-[region] 기술 프로필을 통해 교차 테넌트 인증을 수행합니다.

    • 이는 또한 사용자 홈 테넌트로부터 MS Graph API 토큰을 가져옵니다. 위임된 권한 user.read에 대해 MS Graph API에 대한 권한이 있는 각 지역 테넌트에 네이티브 앱 애플리케이션을 등록합니다.

    • 외부 REST API를 통해 사용자-지역 매핑을 수행하는 기술 프로필의 예는 다음과 같습니다.

      <TechnicalProfile Id="REST-login-NonInteractive-APAC">
        <DisplayName>non interactive authentication to APAC</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
          <Item Key="ServiceUrl">https://login.microsoftonline.com/yourAPACb2ctenant.onmicrosoft.com/oauth2/v2.0/token</Item>
          <Item Key="AuthenticationType">None</Item>
          <Item Key="SendClaimsIn">Form</Item>
          <Item Key="AllowInsecureAuthInProduction">true</Item>
        </Metadata>
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="apac_client_id" PartnerClaimType="client_id" DefaultValue="cf3f6898-9a79-426a-ba16-10e1a377c843" />
          <InputClaim ClaimTypeReferenceId="ropc_grant_type" PartnerClaimType="grant_type" DefaultValue="password" />
          <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="username" />
          <InputClaim ClaimTypeReferenceId="password" />
          <InputClaim ClaimTypeReferenceId="scope" DefaultValue="https://graph.microsoft.com/.default" AlwaysUseDefaultValue="true" />
          <InputClaim ClaimTypeReferenceId="nca" PartnerClaimType="nca" DefaultValue="1" />
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="ext_Api_bearerToken" PartnerClaimType="access_token" />
        </OutputClaims>
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
      </TechnicalProfile>
      
    • ServiceUrl<yourb2ctenant>를 인증 대상으로 지정해야 하는 테넌트로 바꿉니다.

    • 애플리케이션 등록 ApplicationId를 사용하여 apac_client_id 입력 클레임에 대한 DefaultValue를 채웁니다.

  5. 조건부로 각 지역의 REST-fetchUserProfile-[region] 기술 프로필을 통해 교차 테넌트 REST API 호출을 사용하여 사용자 프로필을 가져옵니다.

    • MS Graph API를 통해 사용자 프로필을 읽는 기술 프로필의 예는 다음과 같습니다.

      <TechnicalProfile Id="REST-fetchUserProfile-APAC">
        <DisplayName>fetch user profile cross tenant</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
          <Item Key="ServiceUrl">https://graph.microsoft.com/beta/me</Item>
          <Item Key="AuthenticationType">Bearer</Item>
          <Item Key="UseClaimAsBearerToken">graph_bearerToken</Item>
          <Item Key="SendClaimsIn">Body</Item>
        </Metadata>
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="graph_bearerToken" />
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="id" />
          <OutputClaim ClaimTypeReferenceId="givenName" />
          <OutputClaim ClaimTypeReferenceId="surName" />
          <OutputClaim ClaimTypeReferenceId="displayName" />
          <OutputClaim ClaimTypeReferenceId="userPrincipalName" PartnerClaimType="upn" />
          <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="localAccountAuthentication" />
        </OutputClaims>
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
      </TechnicalProfile>
      

암호 재설정 사용자 지정 정책 구성

암호를 초기화하는 동안 사용자 프로필 위치를 확인하고 사용자 프로필이 있는 Azure AD B2C 테넌트에 대해 암호를 업데이트해야 합니다.

Azure AD B2C 시작 팩에서 LocalAccountSignUpWithLogonEmail 기술 프로필을 수정하여 사용자 지역 조회를 수행하고 각 테넌트에서 암호를 업데이트합니다. ValidationTechnicalProfiles를 다음과 같이 업데이트합니다.

<TechnicalProfile Id="LocalAccountDiscoveryUsingEmailAddress">
  <OutputClaims>
  ...
  <OutputClaim ClaimTypeReferenceId="ext_Api_bearerToken" DefaultValue="EMEA"/>
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="REST-getTokenforExternalApiCalls">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
          <Value>user_region</Value>
          <Value>EMEA</Value>
          <Action>SkipThisValidationTechnicalProfile</Action>
        </Precondition>
      </Preconditions>
    </ValidationTechnicalProfile>
    <ValidationTechnicalProfile ReferenceId="REST-regionLookup" />
    <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress" />
  </ValidationTechnicalProfiles>
</TechnicalProfile>

ValidationTechnicalProfiles는 사용자가 암호를 업데이트하기 위해 유효성을 검사한 이메일을 제출할 때 다음 논리를 수행합니다.

  1. 보호된 API 엔드포인트를 호출하기 위한 토큰 가져오기

  2. 보안 외부 REST API 엔드포인트를 통해 사용자-지역 매핑 조회

    • 이 API 호출은 모든 암호 재설정을 시도하기 전에 이루어지며 이 API에 가동 시간 요구 사항을 유지하기 위한 적절한 부하 분산, 복원력 및 장애 조치(failover) 메커니즘이 있는지 확인하는 것이 중요합니다.

LocalAccountWritePasswordUsingObjectId 기술 프로필을 수정하여 새 암호를 로컬 테넌트에 쓰거나 조건부로 지역 간 테넌트에 쓰세요.

<TechnicalProfile Id="LocalAccountWritePasswordUsingObjectId">
  ...
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AAD-UserWritePasswordUsingObjectId">
        <Preconditions>
          <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
            <Value>user_region</Value>
            <Value>EMEA</Value>
            <Action>SkipThisValidationTechnicalProfile</Action>
          </Precondition>
        </Preconditions>
      </ValidationTechnicalProfile>
    <ValidationTechnicalProfile ReferenceId="REST-UserWritePasswordUsingObjectId-APAC">
        <Preconditions>
          <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
            <Value>user_region</Value>
            <Value>APAC</Value>
            <Action>SkipThisValidationTechnicalProfile</Action>
          </Precondition>
        </Preconditions>
      </ValidationTechnicalProfile>
  </ValidationTechnicalProfiles>
</TechnicalProfile>

ValidationTechnicalProfiles는 사용자가 새 암호를 제출할 때 다음 논리를 수행합니다.

  1. 사용자가 EMEA 테넌트(이 테넌트)에 존재하는 경우 사용자의 새 암호를 디렉터리에 씁니다.

  2. 조건부로 REST API 호출을 사용하여 사용자 프로필이 있는 지역의 사용자 프로필에 새 암호를 씁니다.

    <TechnicalProfile Id="REST-UserWritePasswordUsingObjectId-APAC">
      <DisplayName>Write password to APAC tenant</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="ServiceUrl">https://myApi.com/writePasswordCrossTenant</Item>
        <Item Key="AuthenticationType">Bearer</Item>
        <Item Key="UseClaimAsBearerToken">ext_Api_bearerToken</Item>
        <Item Key="SendClaimsIn">Body</Item>
        <Item Key="DebugMode">true</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="ext_Api_bearerToken" />
        <InputClaim ClaimTypeReferenceId="objectId" />
        <InputClaim ClaimTypeReferenceId="newPassword" />
      </InputClaims>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
    </TechnicalProfile>
    

다음 단계