다음을 통해 공유


관리 ID를 신뢰하도록 애플리케이션 구성(미리 보기)

이 문서에서는 관리 ID를 신뢰하도록 Microsoft Entra 애플리케이션을 구성하는 방법을 설명합니다. 그런 다음 앱 비밀을 사용하거나 관리할 필요 없이 Microsoft Entra로 보호된 리소스에 액세스할 수 있는 액세스 토큰에 대해 관리 ID 토큰을 교환할 수 있습니다.

필수 구성 요소

  • 활성 구독이 있는 Azure 계정입니다. 계정을 무료로만들기.
  • 이 Azure 계정은 애플리케이션을 관리할 수 있는 권한이 필요하며, 특히 권한을 업데이트할 수 있는권한이 있어야 합니다. 다음 Microsoft Entra 역할에는 필요한 권한이 포함됩니다.
  • Azure 리소스에 대한 관리 ID의 개념 이해.
  • 사용자 할당 관리 ID는 워크로드를 호스트하는 Azure 컴퓨팅 리소스(예: 가상 머신 또는 Azure App Service)에 할당됩니다.
  • Microsoft Entra ID의 앱 등록. 이 앱 등록은 관리 ID와 동일한 테넌트에 속해야 합니다.
    • 다른 테넌트의 리소스에 액세스해야 하는 경우 앱 등록은 다중 테넌트 애플리케이션이어야 하며 앱을 다른 테넌트에 프로비전해야 합니다. 또한 해당 테넌트에서 리소스에 대한 앱 액세스 권한을 부여해야 합니다. 다중 테넌트 앱을 다른 테넌트에 추가하는 방법에 대해 알아보세요.
  • 앱 등록에는 Microsoft Entra 보호 리소스(예: Azure, Microsoft Graph, Microsoft 365 등)에 대한 액세스 권한이 부여되어야 합니다. 이 액세스 권한은 API 권한 또는 위임된 권한통해 부여할 수 있습니다.

중요한 고려 사항 및 제한 사항

페더레이션 ID 자격 증명을 만들거나 업데이트하거나 삭제하려면 작업을 수행하는 계정에 애플리케이션 관리자, 애플리케이션 개발자, 클라우드 애플리케이션 관리자또는 애플리케이션 소유자 역할이 있어야 합니다. 연합 신원 자격 증명을 업데이트하려면 microsoft.directory/applications/credentials/update 권한이 필요합니다.

애플리케이션 또는 사용자 할당 관리 ID에 최대 20개 페더레이션 ID 자격 증명을 추가할 수 있습니다.

페더레이션 ID 자격 증명을 구성할 때 제공해야 하는 몇 가지 중요한 정보가 있습니다.

  • 발급자주체는 신뢰 관계를 설정하는 데 필요한 핵심 정보입니다. issuersubject 조합은 앱에서 고유해야 합니다. Azure 워크로드가 Microsoft ID 플랫폼에 관리 ID 토큰을 액세스 토큰으로 교환하도록 요청할 때, 연합 ID 자격 증명의 발급자주체 값이 관리 ID 토큰에 제공된 issuersubject 클레임과 비교하여 검토됩니다. 유효성 검사에 통과하면 Microsoft ID 플랫폼이 외부 소프트웨어 워크로드에 대한 액세스 토큰을 발급합니다.

  • 발급자https://login.microsoftonline.com/{tenant}/v2.0형식의 Microsoft Entra 테넌트 기관 URL URL입니다. Microsoft Entra 앱과 관리 ID는 동일한 테넌트에 속해야 합니다. issuer 클레임 값에 선행 또는 후행 공백이 있으면 토큰 교환이 차단됩니다.

    중요하다

    앱 등록 및 관리 ID는 동일한 테넌트에 있어야 하지만 앱 등록의 서비스 주체는 관리 ID 토큰을 계속 사용할 수 있습니다.

  • 주체는 Azure 워크로드에 할당된 관리 ID의 개체 ID(주체 ID)에 대한 GUID입니다. Microsoft Identity 플랫폼은 들어오는 외부 토큰을 확인하고, 페더레이션 ID 자격 증명에 설정된 주체 필드가 관리 ID의 주체 ID와 일치하지 않으면 액세스 토큰 교환을 거부합니다. GUID는 대/소문자를 구분합니다.

  • 중요하다

    이 기능에서 User-Assigned 관리 ID만 사용할 수 있습니다.

  • *대상 그룹은 외부 토큰에 표시할 수 있는 대상 그룹을 나열합니다(필수). 600자로 제한되는 단일 대상 그룹 값을 추가해야 합니다. 값은 다음 중 하나여야 하며 관리 ID 토큰의 aud 클레임 값과 일치해야 합니다.

    • 퍼블릭 클라우드: api://AzureADTokenExchange
    • 페어팩스: api://AzureADTokenExchangeUSGov
    • Mooncake: api://AzureADTokenExchangeChina
    • USNat: api://AzureADTokenExchangeUSNat
    • USSec: api://AzureADTokenExchangeUSSec

    중요하다

    실수로 발급자, 주체, 또는 대상에 잘못된 정보를 추가해도 페더레이션 ID 자격 증명은 오류 없이 성공적으로 생성됩니다. 토큰 교환이 실패할 때까지 오류가 표시되지 않습니다.

  • 이름은 페더레이션 ID 자격 증명의 고유 식별자입니다. (필수) 이 필드는 문자 제한이 3~120자이며 URL에 친숙해야 합니다. 영숫자, 대시 또는 밑줄 문자가 지원되며 첫 번째 문자는 영숫자여야 합니다. 만든 후에는 변경할 수 없습니다.

  • 설명 페더레이션 ID 자격 증명에 대한 사용자 제공 설명입니다(선택 사항). 이 설명은 Microsoft Entra ID에서 유효성을 검사하거나 확인되지 않습니다. 이 필드는 600자로 제한합니다.

와일드카드 문자는 페더레이션 ID 자격 증명 속성 값에서 지원되지 않습니다.

관리 ID의 개체 ID 가져오기

  1. Azure 포털에 로그인합니다.
  2. 검색 상자에 관리 ID입력합니다. Services, 관리되는 ID를 선택합니다.
  3. 필수 구성 요소의 일부로 생성한 사용자 할당된 관리 ID를 검색하고 선택합니다.
  4. 개요 창에서 개체(보안 주체) ID 값을 복사합니다. 이 값은 페더레이션 자격 증명 구성에서 주체 필드로 사용됩니다.

Azure Portal의 사용자 할당 관리 ID 스크린샷 페더레이션 자격 증명 구성에서 *subject* 필드로 사용할 개체 ID가 강조 표시됩니다.

기존 애플리케이션에서 페더레이션 ID 자격 증명 구성

이 섹션에서는 관리 ID를 신뢰하도록 기존 애플리케이션에서 페더레이션 ID 자격 증명을 구성합니다. 다음 탭을 사용하여 기존 애플리케이션에서 페더레이션 ID 자격 증명을 구성하는 방법을 선택합니다.

  1. Microsoft Entra 관리 센터 로그인합니다. 애플리케이션이 등록된 테넌트에 있는지 확인합니다.

  2. Identity>애플리케이션>앱 등록으로 이동하여, 메인 창에서 애플리케이션을 선택합니다.

  3. 관리아래에서 인증서 및 & 비밀 값를 선택합니다.

  4. 페더레이션 자격 증명 탭을 선택하고 자격 증명추가를 선택합니다.

    페더레이션 자격 증명 탭이 강조 표시된 Microsoft Entra 관리 센터의 인증서 및 비밀 창 스크린샷

  5. 페더레이션 자격 증명 시나리오 드롭다운에서 "다른 발급자"를 선택하고 다음 표에 따라 값을 입력합니다.

    필드 묘사
    발급자 Microsoft Entra ID 기관의 OAuth 2.0/OIDC 발급자 URL입니다. https://login.microsoftonline.com/{tenantID}/v2.0
    주체 식별자 관리 ID의 Principal ID GUID입니다. aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
    이름 자격 증명의 고유한 설명 이름입니다. msi-webapp1
    설명(선택 사항) 페더레이션 ID 자격 증명에 대한 사용자 제공 설명입니다. 워크로드 UAMI가 앱을 가장하도록 신뢰
    관객 외부 토큰에 표시해야 하는 대상 그룹 값입니다. 퍼블릭 클라우드: api://AzureADTokenExchange
    페어팩스: api://AzureADTokenExchangeUSGov
    Mooncake: api://AzureADTokenExchangeChina
    USNat: api://AzureADTokenExchangeUSNat
    USSec: api://AzureADTokenExchangeUSSec

    Microsoft Entra 관리 센터의 자격 증명 창 스크린샷

액세스 토큰을 요청하도록 애플리케이션 코드 업데이트

다음 표의 다음 코드 샘플은 클라이언트 자격 증명 "서비스 간" 흐름을 보여 줍니다. 그러나 OBO(On-Behalf-of) 흐름과 같은 다른 인증 흐름에서 자격 증명으로 관리 ID를 사용할 수 있습니다. 샘플은 리소스 테넌트가 앱 등록과 관리 ID가 있는 테넌트와 동일하거나 다른 테넌트에 있는 경우 모두 유효합니다.

Azure.Identity

다음 예제에서는 Azure.Identity사용하여 Azure Storage 컨테이너에 연결하는 방법을 보여 주지만 Microsoft Entra로 보호되는 모든 리소스에 액세스하도록 조정할 수 있습니다. 샘플은 리소스 테넌트가 앱 등록 및 관리 ID와 동일한 테넌트에 있거나, 다른 테넌트에 있는 경우 모두 유효합니다.

using Azure.Identity;
using Azure.Storage.Blobs;

internal class Program
{
    // This example demonstrates how to access an Azure blob storage account by utilizing the manage identity credential.
  static void Main(string[] args)
  {
        string storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME";
        string containerName = "CONTAINER_NAME";
        
        // The application must be granted access on the target resource
      string appClientId = "YOUR_APP_CLIENT_ID";

        // The tenant where the target resource is created, in this example, the storage account tenant
        // If the resource tenant different from the app tenant, your app needs to be 
      string resourceTenantId = "YOUR_RESOURCE_TENANT_ID";

        // The managed identity which you configured as a Federated Identity Credential (FIC)
      string miClientId = "YOUR_MANAGED_IDENTITY_CLIENT_ID"; 

        // Audience value must be one of the below values depending on the target cloud.
        // Public cloud: api://AzureADTokenExchange
        //  Fairfax: api://AzureADTokenExchangeUSGov
        //  Mooncake: api://AzureADTokenExchangeChina
        //  USNat: api://AzureADTokenExchangeUSNat
        //  USSec: api://AzureADTokenExchangeUSSec
      string audience = "api://AzureADTokenExchange";

        // 1. Create an assertion with the managed identity access token, so that it can be exchanged an app token
        var miCredential = new ManagedIdentityCredential(managedIdentityClientId);
        ClientAssertionCredential assertion = new(
            tenantId,
            appClientId,
            async (token) =>
            {
                // fetch Managed Identity token for the specified audience
                var tokenRequestContext = new Azure.Core.TokenRequestContext(new[] { $"{audience}/.default" });
                var accessToken = await miCredential.GetTokenAsync(tokenRequestContext).ConfigureAwait(false);
                return accessToken.Token;
            });

        // 2. The assertion can be used to obtain an App token (taken care of by the SDK)
        var containerClient  = new BlobContainerClient(new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}"), assertion);

        await foreach (BlobItem blob in containerClient.GetBlobsAsync())
        {
            // TODO: perform operations with the blobs
            BlobClient blobClient = containerClient.GetBlobClient(blob.Name);
            Console.WriteLine($"Blob name: {blobClent.Name}, uri: {blobClient.Uri}");            
        }
  }
}

Microsoft.Identity.Web

Microsoft.Identity.Web의 웹 애플리케이션 또는 웹 API는 인증을 위해 클라이언트 인증서를 서명된 클라이언트 어설션으로 대체할 수 있습니다. 애플리케이션에서 appsettings.jsonClientCredentials 섹션을 다음 구성으로 업데이트할 수 있습니다.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "YOUR_APPLICATION_ID",
    "TenantId": "YOUR_TENANT_ID",

   "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity",
        "ManagedIdentityClientId": "YOUR_USER_ASSIGNED_MANAGED_IDENTITY_CLIENT_ID",
        "TokenExchangeUrl":"api://AzureADTokenExchange"
      }
   ]
  }
}

MSAL(.NET)

MSAL에서 ManagedClientApplication 클래스를 사용하여 관리 ID 토큰을 획득할 수 있습니다. 그런 다음 기밀 클라이언트 애플리케이션을 생성할 때 이 토큰을 클라이언트 어설션으로 사용할 수 있습니다.

경고

.NET 앱의 경우 microsoft.Identity.Web 또는 Azure.Identity같은 MSAL을 기반으로 하는 상위 수준 라이브러리를 사용하는 것이 좋습니다.

using Microsoft.Identity.Client;
using Azure.Storage.Blobs;
using Azure.Core;

internal class Program
{
  static async Task Main(string[] args)
  {
        string storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME";
        string containerName = "CONTAINER_NAME";

      string appClientId = "YOUR_APP_CLIENT_ID";
      string resourceTenantId = "YOUR_RESOURCE_TENANT_ID";
      Uri authorityUri = new($"https://login.microsoftonline.com/{resourceTenantId}");
      string miClientId = "YOUR_MI_CLIENT_ID";
      string audience = "api://AzureADTokenExchange";

      // Get mi token to use as assertion
      var miAssertionProvider = async (AssertionRequestOptions _) =>
      {
            var miApplication = ManagedIdentityApplicationBuilder
                .Create(ManagedIdentityId.WithUserAssignedClientId(miClientId))
                .Build();

            var miResult = await miApplication.AcquireTokenForManagedIdentity(audience)
                .ExecuteAsync()
                .ConfigureAwait(false);
            return miResult.AccessToken;
      };

      // Create a confidential client application with the assertion.
      IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(appClientId)
        .WithAuthority(authorityUri, false)
        .WithClientAssertion(miAssertionProvider)
        .WithCacheOptions(CacheOptions.EnableSharedCacheOptions)
        .Build();

        // Get the federated app token for the storage account
      string[] scopes = [$"https://{storageAccountName}.blob.core.windows.net/.default"];
      AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync().ConfigureAwait(false);

        TokenCredential tokenCredential = new AccessTokenCredential(result.AccessToken);
        var client = new BlobContainerClient(
            new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}"),
            tokenCredential);

        await foreach (BlobItem blob in containerClient.GetBlobsAsync())
        {
            // TODO: perform operations with the blobs
            BlobClient blobClient = containerClient.GetBlobClient(blob.Name);
            Console.WriteLine($"Blob name: {blobClient.Name}, URI: {blobClient.Uri}");
        }
  }
}

참고 사항