온-프레미스에서 호스트되는 .NET 앱에서 Azure 리소스에 인증

Azure 외부(예: 온-프레미스 또는 타사 데이터 센터)에서 호스팅되는 앱은 Azure 리소스에 액세스할 때 애플리케이션 서비스 주체를 사용하여 Azure에 인증해야 합니다. 애플리케이션 서비스 주체 개체는 Azure에서 앱 등록 프로세스를 사용하여 만들어집니다. 애플리케이션 서비스 주체가 만들어지면 앱에 대한 클라이언트 ID 및 클라이언트 암호가 생성됩니다. 그런 다음 클라이언트 ID, 클라이언트 암호 및 테넌트 ID가 환경 변수에 저장되므로, Azure ID 라이브러리에서 이를 사용하여 런타임에 Azure에 앱을 인증할 수 있습니다.

앱이 호스트되는 각 환경에 대해 다른 앱 등록을 만들어야 합니다. 이렇게 하면 각 서비스 주체에 대해 환경별 리소스 권한을 구성하고 한 환경에 배포된 앱이 다른 환경의 일부인 Azure 리소스와 통신하지 않도록 할 수 있습니다.

1 - Azure에서 애플리케이션 등록

Azure Portal 또는 Azure CLI를 사용하여 Azure에서 앱을 등록할 수 있습니다.

Azure Portal에 로그인하고 다음 단계를 따릅니다.

지침 스크린샷
Azure Portal에서 다음을 수행합니다.
  1. Azure Portal 상단의 검색 창에 앱 등록을 입력합니다.
  2. 검색 창 아래에 나타나는 메뉴의 서비스 제목 아래에서 앱 등록이라는 항목을 선택합니다.
Azure Portal에서 상단 검색창을 사용하여 앱 등록 페이지를 찾아서 탐색하는 방법을 보여주는 스크린샷.
앱 등록 페이지에서 + 신규 등록 을 선택합니다. 앱 등록 페이지에서 새 등록 단추의 위치를 보여주는 스크린샷.
애플리케이션 등록 페이지에서 다음과 같이 양식을 작성합니다.
  1. 이름 → Azure에 앱 등록을 위한 이름을 입력합니다. 이 이름에는 앱 등록을 위한 앱 이름 및 환경(테스트, 프로덕션)이 포함되는 것이 좋습니다.
  2. 지원되는 계정 유형이 조직 디렉터리의 계정만.
등록을 선택하여 앱을 등록하고 애플리케이션 서비스 주체를 만듭니다.
앱에 이름을 지정하고 지원되는 계정 유형을 이 조직 디렉터리의 계정으로만 지정하여 애플리케이션 등록 페이지를 작성하는 방법을 보여주는 스크린샷.
앱의 앱 등록 페이지에서:
  1. 애플리케이션(클라이언트) ID → 로컬 개발 중에 앱이 Azure에 액세스하는 데 사용할 앱 ID입니다. 이후 단계에서 필요하므로 이 값을 텍스트 편집기의 임시 위치에 복사합니다.
  2. 디렉터리(테넌트) ID → 이 값은 앱이 Azure에 인증할 때에도 필요합니다. 이 값을 텍스트 편집기에서 임시 위치에 복사합니다. 이후 단계에서도 필요합니다.
  3. 클라이언트 자격 증명 → 앱이 Azure에 인증하고 Azure 서비스를 사용하려면 먼저 앱에 대한 클라이언트 자격 증명을 설정해야 합니다. 앱에 대한 자격 증명을 추가하려면 인증서 또는 비밀 추가를 선택합니다.
앱 등록이 완료된 후의 앱 등록 페이지 스크린샷. 이 스크린샷은 이후 단계에서 필요할 애플리케이션 ID 및 테넌트 ID의 위치를 보여줍니다. 또한 앱에 대한 애플리케이션 암호를 추가하는 데 사용할 링크의 위치도 보여줍니다.
인증서 및 암호 페이지에서 + 새 클라이언트 암호를 선택합니다. 인증서 및 암호 페이지에서 새 클라이언트 암호를 만드는 데 사용할 링크의 위치를 보여주는 스크린샷.
클라이언트 암호 추가 대화 상자가 페이지 오른쪽에 나타납니다. 이 대화 상자에서:
  1. 설명현재 값을 입력합니다.
  2. 만료24개월 값을 선택합니다.
비밀을 추가하려면 추가를 선택합니다.

중요: 비밀의 만료 날짜 이전에 일정에 미리 알림을 설정합니다. 이렇게 하면 이전에 새 비밀을 추가하고 이 비밀이 만료되기 전에 앱을 업데이트하여 앱에서 서비스 중단을 방지할 수 있습니다.
앱 등록 프로세스에서 만든 애플리케이션 서비스 주체에 대한 새 클라이언트 암호가 추가되는 페이지를 보여주는 스크린샷.
인증서 및 비밀 페이지에 클라이언트 암호 값이 표시됩니다.

이후 단계에서 필요하므로 이 값을 텍스트 편집기의 임시 위치에 복사합니다.

중요: 이 값을 볼 수 있는 유일한 시간입니다. 이 페이지를 나가거나 새로 고치면 이 값을 다시 볼 수 없습니다. 이 클라이언트 암호를 무효화하지 않고 추가 클라이언트 암호를 추가할 수 있지만 이 값은 다시 표시되지 않습니다.
생성된 클라이언트 암호가 있는 페이지를 보여주는 스크린샷.

2 - 애플리케이션 서비스 주체에 역할 할당

다음으로, 어떤 리소스에 대해 앱에 필요한 역할(권한)을 결정하고 해당 역할을 앱에 할당해야 합니다. 역할은 리소스, 리소스 그룹 또는 구독 범위에서 역할을 할당할 수 있습니다. 이 예에서는 대부분의 앱이 모든 Azure 리소스를 단일 리소스 그룹으로 그룹화하므로 리소스 그룹 범위에서 서비스 주체에 대한 역할을 할당하는 방법을 보여 줍니다.

지침 스크린샷
Azure Portal 상단에 있는 검색창을 통해 리소스 그룹 이름을 검색하여 앱에 대한 리소스 그룹을 찾습니다.

대화 상자의 리소스 그룹 제목 아래에서 리소스 그룹 이름을 선택하여 리소스 그룹으로 이동합니다.
Azure Portal에서 상단 검색창을 사용하여 역할(권한)을 할당하려는 리소스 그룹을 찾아서 탐색하는 방법을 보여주는 스크린샷.
리소스 그룹 페이지의 왼쪽 메뉴에서 액세스 제어(IAM)를 선택합니다. 액세스 제어(IAM) 메뉴 항목의 위치를 보여주는 리소스 그룹 페이지의 스크린샷.
액세스 제어(IAM) 페이지에서 다음을 수행합니다.
  1. 역할 할당 탭을 선택합니다.
  2. 위쪽 메뉴에서 + 추가를 선택한 다음, 드롭다운 메뉴에서 역할 할당 추가를 선택합니다.
역할 할당 탭으로 이동하는 방법 및 리소스 그룹에 역할 할당을 추가하는 데 사용되는 단추의 위치를 보여주는 스크린샷.
역할 할당 추가 페이지에는 리소스 그룹에 할당할 수 있는 모든 역할이 나열됩니다.
  1. 검색 상자를 사용하여 목록을 보다 관리하기 쉬운 크기로 필터링합니다. 이 예에서는 Storage Blob 역할을 필터링하는 방법을 보여 줍니다.
  2. 할당하려는 역할을 선택합니다.
다음 화면으로 이동하려면 다음을 선택합니다.
리소스 그룹에 추가할 역할 할당을 필터링하고 선택하는 방법을 보여주는 스크린샷.
다음 역할 할당 추가 페이지에서는 역할을 할당할 사용자를 할당할 수 있습니다.
  1. 액세스 할당에서 사용자, 그룹 또는 서비스 주체를 선택합니다.
  2. 구성원 아래에서 + 구성원 선택을 선택합니다.
Azure Portal의 오른쪽에 대화 상자가 열립니다.
Microsoft Entra 그룹에 역할을 할당하기 위해 선택하는 라디오 단추와 역할을 할당할 그룹을 선택하는 데 사용되는 링크를 보여주는 스크린샷.
멤버 선택 대화 상자에서:
  1. 선택 텍스트 상자를 사용하여 구독의 사용자 및 그룹 목록을 필터링할 수 있습니다. 필요한 경우 앱을 위해 만든 서비스 주체의 처음 몇 문자를 입력하여 목록을 필터링합니다.
  2. 애플리케이션과 연결된 서비스 주체를 선택합니다.
계속하려면 대화 상자 하단에서 선택을 선택합니다.
구성원 선택 대화 상자에서 애플리케이션에 대한 Microsoft Entra 그룹을 필터링하고 선택하는 방법을 보여주는 스크린샷.
이제 서비스 주체가 역할 할당 추가 화면에서 선택된 것으로 표시됩니다.

검토 + 할당을 선택하여 최종 페이지로 이동한 다음 다시 검토 + 할당을 선택하여 프로세스를 완료합니다.
완료된 역할 할당 추가 페이지와 프로세스를 완료하는 데 사용된 검토 + 할당 단추의 위치를 보여주는 스크린샷.

3 - 애플리케이션에 대한 환경 변수 구성

DefaultAzureCredential 개체는 런타임 시 환경 변수 집합에서 서비스 주체 자격 증명을 찾습니다. .NET으로 작업할 때 도구 및 환경에 따라 환경 변수를 구성하는 방법에는 여러 가지가 있습니다.

어떤 방식을 선택하든 서비스 주체로 작업할 때는 다음 환경 변수를 구성합니다.

  • AZURE_CLIENT_ID → 앱 ID 값입니다.
  • AZURE_TENANT_ID → 테넌트 ID 값입니다.
  • AZURE_CLIENT_SECRET → 앱에 대해 생성된 암호/자격 증명입니다.

앱이 IIS에서 호스팅되는 경우 앱 간에 설정을 격리하도록 앱 풀당 환경 변수를 설정하는 것이 좋습니다.

appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_ID',value='00000000-0000-0000-0000-000000000000']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_TENANT_ID',value='11111111-1111-1111-1111-111111111111']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_SECRET',value='=abcdefghijklmnopqrstuvwxyz']" /commit:apphost

applicationHost.config 파일 내의 applicationPools 요소를 사용하여 이러한 설정을 직접 구성할 수도 있습니다.

<applicationPools>
   <add name="CorePool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic">
      <environmentVariables>
         <add name="ASPNETCORE_ENVIRONMENT" value="Development" />
         <add name="AZURE_CLIENT_ID" value="00000000-0000-0000-0000-000000000000" />
         <add name="AZURE_TENANT_ID" value="11111111-1111-1111-1111-111111111111" />
         <add name="AZURE_CLIENT_SECRET" value="=abcdefghijklmnopqrstuvwxyz" />
      </environmentVariables>
   </add>
</applicationPools>

4 - 애플리케이션에 DefaultAzureCredential 구현

DefaultAzureCredential은 Microsoft Entra에 인증하기 위한 순서가 지정된 독자적 메커니즘 시퀀스입니다. 각 인증 메커니즘은 TokenCredential 클래스에서 파생된 클래스이며 자격 증명이라고 합니다. 런타임에 DefaultAzureCredential은 첫 번째 자격 증명을 사용하여 인증을 시도합니다. 해당 자격 증명이 액세스 토큰을 획득하지 못하면 액세스 토큰을 성공적으로 가져올 때까지 시퀀스의 다음 자격 증명이 차례로 시도됩니다. 이러한 방식을 통해 앱은 환경별 코드를 작성하지 않고도 다양한 환경에서 여러 자격 증명을 사용할 수 있습니다.

DefaultAzureCredential이 자격 증명을 찾는 순서와 위치는 DefaultAzureCredential에서 확인할 수 있습니다.

DefaultAzureCredential을 사용하려면 애플리케이션에 Azure.Identity를 추가하고 필요에 따라 Microsoft.Extensions.Azure 패키지를 추가합니다.

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

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

Azure 서비스는 다양한 Azure SDK 클라이언트 라이브러리의 특수 클라이언트 클래스를 사용하여 액세스됩니다. 이러한 클래스와 자체 사용자 지정 서비스는 등록해야 앱 전체에서 종속성 주입을 통해 액세스할 수 있습니다. Program.cs에서 다음 단계를 완료하여 클라이언트 클래스와 DefaultAzureCredential을 등록합니다.

  1. using 지시문을 통해 Azure.IdentityMicrosoft.Extensions.Azure 네임스페이스를 포함합니다.
  2. 해당하는 Add 접두사 확장 메서드를 사용하여 Azure 서비스 클라이언트를 등록합니다.
  3. DefaultAzureCredential 인스턴스를 UseCredential 메서드에 전달합니다.

예시:

using Microsoft.Extensions.Azure;
using Azure.Identity;

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));
    clientBuilder.UseCredential(new DefaultAzureCredential());
});

UseCredential의 대안은 DefaultAzureCredential을 직접 인스턴스화하는 것입니다.

using Azure.Identity;

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

위 코드가 로컬의 개발용 워크스테이션에서 실행되면 환경 변수에서 애플리케이션 서비스 주체를 찾거나 로컬에 설치된 개발자 도구(예: Visual Studio)에서 개발자 자격 증명 집합을 찾습니다. 두 방법 중 하나를 사용하여 로컬 개발 중에 Azure 리소스에 앱을 인증할 수 있습니다.

Azure에 배포되면 이 동일한 코드로 다른 Azure 리소스에 앱을 인증할 수도 있습니다. DefaultAzureCredential은 환경 설정 및 관리 ID 구성을 검색하여 다른 서비스에 자동으로 인증할 수 있습니다.