다음을 통해 공유


시스템 할당 관리 ID를 사용하여 Azure 리소스에 Azure 호스팅 .NET 앱 인증

다른 Azure 리소스에 Azure 호스팅 앱을 인증하는 권장 방법은 관리 ID사용하는 것입니다. 이 방법은 Azure App Service, Azure Container Apps 및 Azure Virtual Machines에서 호스트되는 앱을 포함하여 대부분의 Azure 서비스 지원됩니다. 인증 개요 페이지에서 다양한 인증 기술 및 접근 방식에 대해 자세히 알아봅니다. 앞의 섹션에서는 다음을 알아봅니다.

  • 필수 관리 ID 개념
  • 앱에 대한 시스템 할당 관리 ID를 만드는 방법
  • 시스템 할당 관리 ID에 역할을 할당하는 방법
  • 앱 코드에서 시스템 할당 관리 ID를 사용하여 인증하는 방법

필수 관리 ID 개념

관리 ID를 사용하면 앱이 비밀 키 또는 다른 애플리케이션 비밀을 사용하지 않고도 다른 Azure 리소스에 안전하게 연결할 수 있습니다. 내부적으로 Azure는 아이덴티티와 연결할 수 있는 리소스를 추적합니다. Azure는 이 정보를 사용하여 앱이 다른 Azure 리소스에 연결할 수 있도록 앱에 대한 Microsoft Entra 토큰을 자동으로 가져옵니다.

호스트된 앱을 구성할 때 고려해야 할 관리 ID에는 두 가지 유형이 있습니다.

  • 시스템 할당 관리 ID는 Azure 리소스에서 직접 사용하도록 설정되며 수명 주기에 연결됩니다. 리소스가 삭제되면 Azure에서 자동으로 ID를 삭제합니다. 시스템 할당 ID는 관리 ID를 사용하는 최소한의 접근 방식을 제공합니다.
  • 사용자 할당 관리 ID는 독립 실행형 Azure 리소스로 만들어지고 더 큰 유연성과 기능을 제공합니다. 동일한 ID 및 권한을 공유해야 하는 여러 Azure 리소스와 관련된 솔루션에 이상적입니다. 예를 들어 여러 가상 머신이 동일한 Azure 리소스 집합에 액세스해야 하는 경우 사용자 할당 관리 ID는 재사용 가능성과 최적화된 관리를 제공합니다.

관리 ID 모범 사례 권장 사항 문서에서 시스템 할당 관리 ID 및 사용자 할당 관리 ID를 선택하고 관리하는 방법에 대해 자세히 알아봅니다.

앞의 섹션에서는 Azure 호스팅 앱에 대해 시스템 할당 관리 ID를 사용하도록 설정하고 사용하는 단계를 설명합니다. 사용자 할당 관리 ID를 사용해야 하는 경우 사용자 할당 관리 ID 문서를 참조하세요.

Azure 호스팅 리소스에서 시스템 할당 관리 ID 사용

앱에서 시스템 할당 관리 ID 사용을 시작하려면 Azure App Service, Azure Container App 또는 Azure Virtual Machine과 같은 앱을 호스팅하는 Azure 리소스에서 ID를 사용하도록 설정합니다.

Azure Portal 또는 Azure CLI를 사용하여 Azure 리소스에 대해 시스템 할당 관리 ID를 사용하도록 설정할 수 있습니다.

  1. Azure Portal에서 Azure App Service 또는 Azure Container App 인스턴스와 같은 애플리케이션 코드를 호스트하는 리소스로 이동합니다.

  2. 리소스의 개요 페이지에서 설정 확장하고 탐색에서 ID 선택합니다.

  3. ID 페이지에서 상태 슬라이더를 전환합니다.

  4. 저장을 선택하여 변경 내용을 적용합니다.

    컨테이너 앱에서 시스템 할당 관리 ID를 사용하도록 설정하는 방법을 보여 주는 스크린샷입니다.

관리 ID에 역할 할당

다음으로 앱에 필요한 역할을 결정하고 관리 ID에 해당 역할을 할당합니다. 다음 범위에서 관리 ID에 역할을 할당할 수 있습니다.

  • 리소스: 할당된 역할은 해당 특정 리소스에만 적용됩니다.
  • 리소스 그룹: 할당된 역할은 리소스 그룹에 포함된 모든 리소스에 적용됩니다.
  • 구독: 할당된 역할은 구독에 포함된 모든 리소스에 적용됩니다.

다음 예제에서는 많은 앱이 단일 리소스 그룹을 사용하여 관련된 모든 Azure 리소스를 관리하므로 리소스 그룹 범위에서 역할을 할당하는 방법을 보여 줍니다.

  1. 시스템 할당 관리 ID가 있는 앱이 포함된 리소스 그룹의 개요 페이지로 이동합니다.

  2. 왼쪽 탐색 영역에서 액세스 제어(IAM) 선택합니다.

  3. 액세스 제어(IAM) 페이지에서 위쪽 메뉴에서 + 추가를 선택한 다음 역할 할당 추가 선택하여 역할 할당 추가 페이지로 이동합니다.

    ID 역할 할당 페이지에 액세스하는 방법을 보여 주는 스크린샷

  4. 역할 할당 추가 페이지에는 ID에 역할을 할당하는 탭이 있는 다단계 워크플로가 표시됩니다. 초기 역할 탭에서 맨 위에 있는 검색 상자를 사용하여 ID에 할당할 역할을 찾습니다.

  5. 결과에서 역할을 선택한 다음 다음 선택하여 멤버 탭으로 이동합니다.

  6. 액세스 권한 할당 옵션에 대해 관리 ID 선택합니다.

  7. 멤버 옵션의 경우 + 멤버 선택 선택하여 관리 ID 선택 패널을 엽니다.

  8. 관리 ID 선택 패널에서 구독관리 ID 드롭다운을 사용하여 ID에 대한 검색 결과를 필터링합니다. 검색 상자를 사용하여 앱을 호스팅하는 Azure 리소스에 대해 사용하도록 설정한 시스템 ID를 찾습니다.

    관리 ID 할당 프로세스를 보여 주는 스크린샷

  9. ID를 선택하고 패널 아래쪽에서 선택하여 계속합니다.

  10. 페이지 맨 아래에서 검토 + 할당을 선택합니다.

  11. 마지막 검토 + 할당 탭에서 검토 + 할당을 선택하여 워크플로를 완료합니다.

앱에서 Azure 서비스에 인증

Azure ID 라이브러리 다양한 자격 증명다양한 시나리오 및 Microsoft Entra 인증 흐름을 지원하는 데 맞게 조정된 TokenCredential 구현을 제공합니다. 로컬로 실행할 때 관리 ID를 사용할 수 없으므로 다음 단계에서는 어떤 시나리오에서 사용할 자격 증명을 보여 줍니다.

  • 로컬 개발 환경: 로컬 개발만 동안 미리 구성된 의견 있는 자격 증명 체인에 DefaultAzureCredential 클래스를 사용합니다. DefaultAzureCredential Azure CLI 또는 Visual Studio와 같은 로컬 도구 또는 IDE에서 사용자 자격 증명을 검색합니다. 또한 재시도, 응답 대기 시간 및 여러 인증 옵션에 대한 지원을 위한 유연성과 편의성을 제공합니다. 자세한 내용은 로컬 개발 문서에서 Azure 서비스에 대한 인증을 참조하세요.
  • Azure 호스팅 앱: 앱이 Azure에서 실행되는 경우 ManagedIdentityCredential 사용하여 앱에 대해 구성된 관리 ID를 안전하게 검색합니다. 이 정확한 유형의 자격 증명을 지정하면 사용 가능한 다른 자격 증명이 예기치 않게 선택되지 않습니다.

코드 구현

Azure.Identity 패키지를 추가합니다. ASP.NET Core 프로젝트에서는 Microsoft.Extensions.Azure 패키지도 설치합니다.

선택한 터미널에서 애플리케이션 프로젝트 디렉터리로 이동하고 다음 명령을 실행합니다.

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure

Azure 서비스는 다양한 Azure SDK 클라이언트 라이브러리의 특수 클라이언트 클래스를 사용하여 액세스합니다. 이러한 클래스 및 사용자 지정 서비스는 종속성 주입을 위해 등록되어야 앱 전체에서 사용할 수 있습니다. Program.cs종속성 주입 및 토큰 기반 인증에 대한 클라이언트 클래스를 구성하려면 다음 단계를 완료합니다.

  1. using 지시문을 통해 Azure.IdentityMicrosoft.Extensions.Azure 네임스페이스를 포함합니다.
  2. 해당 Add접두사 확장 메서드를 사용하여 Azure 서비스 클라이언트를 등록합니다.
  3. 적절한 TokenCredential 인스턴스를 UseCredential 메서드에 전달합니다.
    • 앱이 로컬로 실행 중일 때 DefaultAzureCredential 사용합니다.
    • 앱이 Azure에서 실행 중일 때 ManagedIdentityCredential 사용합니다.
builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));

    TokenCredential credential = null;

    if (builder.Environment.IsProduction())
    {
        // Managed identity token credential discovered when running in Azure environments
        credential = new ManagedIdentityCredential();
    }
    else
    {
        // Running locally on dev machine - DO NOT use in production or outside of local dev
        credential = new DefaultAzureCredential();
    }

    clientBuilder.UseCredential(credential);
});

UseCredential 메서드의 대안은 서비스 클라이언트에 자격 증명을 직접 제공하는 것입니다.

TokenCredential credential = null;

if (builder.Environment.IsProduction() || builder.Environment.IsStaging())
{
    // Managed identity token credential discovered when running in Azure environments
    credential = new ManagedIdentityCredential();
}
else
{
    // Running locally on dev machine - DO NOT use in production or outside of local dev
    credential = new DefaultAzureCredential();
}

builder.Services.AddSingleton<BlobServiceClient>(_ =>
    new BlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"), credential));

위의 코드는 실행 중인 환경에 따라 다르게 동작합니다.

  • 로컬 개발 워크스테이션에서 DefaultAzureCredential 애플리케이션 서비스 주체의 환경 변수 또는 Visual Studio와 같은 로컬로 설치된 개발자 도구에서 개발자 자격 증명 집합을 찾습니다.
  • Azure에 배포되면 ManagedIdentityCredential 관리 ID 구성을 검색하여 다른 서비스에 자동으로 인증합니다.