이 문서에서는 관리 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 자격 증명을 구성할 때 제공해야 하는 몇 가지 중요한 정보가 있습니다.
발급자, 주체 는 신뢰 관계를 설정하는 데 필요한 정보의 핵심 요소입니다. Azure 워크로드가 Microsoft ID 플랫폼에 Entra 앱 액세스 토큰에 대한 관리 ID 토큰을 교환하도록 요청하면 페더레이션 ID 자격 증명의 발급자 및 주체 값이 관리 ID 토큰에 제공된 클레임과
issuer
비교subject
됩니다. 유효성 검사에 통과하면 Microsoft ID 플랫폼이 외부 소프트웨어 워크로드에 대한 액세스 토큰을 발급합니다.발급자는
https://login.microsoftonline.com/{tenant}/v2.0
형식의 Microsoft Entra 테넌트 기관 URL입니다. Microsoft Entra 앱과 관리 ID는 모두 동일한 테넌트에 속해야 합니다.issuer
클레임 값에 선행 또는 후행 공백이 있으면 토큰 교환이 차단됩니다.subject
: Azure 워크로드에 할당된 관리된 ID의 개체(보안 주체) ID에 대한 대/소문자를 구분하는 GUID입니다. 관리 ID는 대상 리소스가 다른 클라우드에 있더라도 앱 등록과 동일한 테넌트에 있어야 합니다. Microsoft ID 플랫폼은 페더레이션 ID 자격 증명 구성이 관리 ID의 보안 주체 ID와 정확히 일치하지 않는 경우subject
토큰 교환을 거부합니다.대상 그룹은 관리 ID 토큰(필수)의 클레임에 표시되는
aud
값을 지정합니다. 값은 대상 클라우드에 따라 다음 중 하나여야 합니다.-
Microsoft Entra ID 전역 서비스:
api://AzureADTokenExchange
- Microsoft Entra ID 미국 정부:
api://AzureADTokenExchangeUSGov
-
Microsoft Entra China는 21Vianet에 의해 운영되는:
api://AzureADTokenExchangeChina
중요하다
다른 테넌트에서 리소스에 액세스하는 것이 지원됩니다. 다른 클라우드의 리소스 액세스는 지원되지 않습니다. 다른 클라우드에 대한 토큰 요청이 실패합니다.
중요하다
실수로 발급자, 주체, 또는 대상에 잘못된 정보를 추가해도 페더레이션 ID 자격 증명은 오류 없이 성공적으로 생성됩니다. 토큰 교환이 실패할 때까지 오류가 표시되지 않습니다.
-
Microsoft Entra ID 전역 서비스:
이름은 페더레이션 ID 자격 증명의 고유 식별자입니다. (필수) 이 필드는 문자 제한이 3~120자이며 URL에 친숙해야 합니다. 영숫자, 대시 또는 밑줄 문자가 지원되며 첫 번째 문자는 영숫자여야 합니다. 만든 후에는 변경할 수 없습니다.
설명 페더레이션 ID 자격 증명에 대한 사용자 제공 설명입니다(선택 사항). 이 설명은 Microsoft Entra ID에서 유효성을 검사하거나 확인되지 않습니다. 이 필드는 600자로 제한합니다.
와일드카드 문자는 페더레이션 ID 자격 증명 속성 값에서 지원되지 않습니다.
애플리케이션에서 페더레이션 ID 자격 증명 구성
이 섹션에서는 관리 ID를 신뢰하도록 기존 애플리케이션에서 페더레이션 ID 자격 증명을 구성합니다. 다음 탭을 사용하여 기존 애플리케이션에서 페더레이션 ID 자격 증명을 구성하는 방법을 선택합니다.
- Microsoft Entra 관리 센터
- Azure CLI
- PowerShell
- API들
- 이두근
Microsoft Entra 관리 센터 에로그인합니다. 애플리케이션이 등록된 테넌트에 있는지 확인합니다.
Entra ID>앱 등록으로 이동하고 주 창에서 애플리케이션을 선택합니다.
관리아래에서 인증서 및 & 비밀 값를 선택합니다.
페더레이션 자격 증명 탭을 선택하고 자격 증명추가를 선택합니다.
페더레이션 자격 증명 시나리오 드롭다운에서 관리 ID를 선택하고 다음 표에 따라 값을 채웁니다.
필드 설명 예 발급자 관리 ID 토큰을 발급하는 Microsoft Entra ID 기관의 OAuth 2.0/OIDC 발급자 URL입니다. 이 값은 현재 Entra 테넌트 발급자를 사용하여 자동으로 채워집니다. https://login.microsoftonline.com/{tenantID}/v2.0
관리 ID 선택 이 링크를 클릭하여 페더레이션 ID 자격 증명 역할을 하는 관리 ID를 선택합니다. User-Assigned 관리 ID만 자격 증명으로 사용할 수 있습니다. msi-webapp1 설명(선택 사항) 페더레이션 ID 자격 증명에 대한 사용자 제공 설명입니다. 내 앱에 대한 자격 증명으로 워크로드 UAMI를 사용하고 신뢰하세요 관객 외부 토큰에 표시해야 하는 대상 그룹 값입니다. 다음 값 중 하나로 설정해야 합니다.
• Entra ID 전역 서비스: api://AzureADTokenExchange
• Entra ID 미국 정부용: api://AzureADTokenExchangeUSGov
• 21Vianet 이 운영하는 중국 내Entra ID: api://AzureADTokenExchangeChina
액세스 토큰을 요청하도록 애플리케이션 코드 업데이트
다음 코드 조각에서는 관리 ID 토큰을 획득하고 Entra 애플리케이션에 대한 자격 증명으로 사용하는 방법을 보여 줍니다. 샘플은 대상 리소스가 Entra 애플리케이션과 동일한 테넌트 또는 다른 테넌트에 있는 두 경우 모두 유효합니다.
Azure ID 클라이언트 라이브러리
다음 코드 샘플에서는 Azure Key Vault 비밀에 액세스하는 방법을 보여 주지만 Microsoft Entra로 보호되는 모든 리소스에 액세스하도록 조정할 수 있습니다.
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
// Audience value must be one of the below values depending on the target cloud:
// - Entra ID Global cloud: api://AzureADTokenExchange
// - Entra ID US Government: api://AzureADTokenExchangeUSGov
// - Entra ID China operated by 21Vianet: api://AzureADTokenExchangeChina
string miAudience = "api://AzureADTokenExchange";
// Create an assertion with the managed identity access token, so that it can be
// exchanged for an app token. Client ID is passed here. Alternatively, either
// object ID or resource ID can be passed.
ManagedIdentityCredential miCredential = new(
ManagedIdentityId.FromUserAssignedClientId("<YOUR_MI_CLIENT_ID>"));
TokenRequestContext tokenRequestContext = new([$"{miAudience}/.default"]);
ClientAssertionCredential clientAssertionCredential = new(
"<YOUR_RESOURCE_TENANT_ID>",
"<YOUR_APP_CLIENT_ID>",
async _ =>
(await miCredential
.GetTokenAsync(tokenRequestContext)
.ConfigureAwait(false)).Token
);
// Create a new SecretClient using the assertion
SecretClient client = new(
new Uri("https://testfickv.vault.azure.net/"),
clientAssertionCredential);
// Retrieve the secret
KeyVaultSecret secret = client.GetSecret("<SECRET_NAME>");
Microsoft.Identity.웹
Microsoft.Identity.Web에서 ClientCredentials
섹션을 설정하여 을 사용해 구성된 관리 ID를 자격 증명으로 코드에서 사용할 수 있습니다.
{
"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/.default"
}
]
}
}
MSAL(.NET)
MSAL에서 ManagedClientApplication 클래스를 사용하여 관리 ID 토큰을 획득할 수 있습니다. 그런 다음 기밀 클라이언트 애플리케이션을 생성할 때 이 토큰을 클라이언트 어설션으로 사용할 수 있습니다.
using Microsoft.Identity.Client;
using Microsoft.Identity.Client.AppConfig;
using Azure.Storage.Blobs;
using Azure.Core;
using Azure.Storage.Blobs.Models;
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/.default";
// 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 containerClient = 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}");
}
}
}
참고 사항
- 페더레이션 ID 자격 증명에 대한 중요한 고려 사항 및 제한 사항.