온-프레미스 또는 타사 데이터 센터와 같이 Azure 외부에서 호스트되는 앱은 Microsoft Entra ID 통해 애플리케이션 서비스 주체를 사용하여 Azure 서비스에 인증해야 합니다. 앞의 섹션에서는 다음을 알아봅니다.
- Microsoft Entra에 애플리케이션을 등록하여 서비스 주체를 만드는 방법
- 범위 권한에 역할을 할당하는 방법
- 앱 코드에서 서비스 주체를 사용하여 인증하는 방법
전용 애플리케이션 서비스 주체를 사용하면 Azure 리소스에 액세스할 때 최소 권한 원칙을 준수할 수 있습니다. 권한은 개발 중에 앱의 특정 요구 사항으로 제한되어 다른 앱 또는 서비스를 위한 Azure 리소스에 실수로 액세스할 수 없도록 합니다. 또한 이 접근 방식은 앱이 개발 환경에서 과도하게 권한이 부여되지 않도록 하여 앱을 프로덕션으로 이동할 때 발생하는 문제를 방지하는 데 도움이 됩니다.
앱이 호스트되는 각 환경에 대해 다른 앱 등록을 만들어야 합니다. 이렇게 하면 각 서비스 주체에 대해 환경별 리소스 권한을 구성하고 한 환경에 배포된 앱이 다른 환경의 일부인 Azure 리소스와 통신하지 않도록 할 수 있습니다.
Azure에서 앱 등록
애플리케이션 서비스 주체 개체는 Azure Portal 또는 Azure CLI를 사용하여 Azure에서 앱 등록을 통해 만들어집니다.
- Azure 포털
- Azure CLI
Azure Portal에서 검색 창을 사용하여 앱 등록 페이지로 이동합니다.
앱 등록 페이지에서 + 새 등록선택합니다.
애플리케이션 등록 페이지에서 다음을 수행합니다.
- 이름 필드에 앱 이름과 대상 환경을 포함하는 설명 값을 입력합니다.
- 지원되는계정 유형에 대해 이 조직 디렉터리에서만 계정(Microsoft 고객 주도 전용 - 단일 테넌트)선택하거나 요구 사항에 가장 적합한 옵션을 선택합니다.
등록 선택하여 앱을 등록하고 서비스 주체를 만듭니다.
앱의 앱 등록 페이지에서 애플리케이션(클라이언트) ID 및 디렉터리(테넌트) ID 복사하여 앱 코드 구성에서 나중에 사용할 수 있도록 임시 위치에 붙여넣습니다.
인증서 또는 비밀 추가를 선택하여 앱에 대한 자격 증명을 설정합니다.
인증서 & 비밀 페이지에서 + 새 클라이언트 암호선택합니다.
클라이언트 암호 추가 플라이아웃 패널이 열립니다:
- 설명에 '현재'로 값을 입력하십시오.
- 만료 값의 경우 기본 권장값인 180일을 그대로 둡니다.
- 추가하여 비밀을 추가합니다.
인증서 & 비밀 페이지에서 이후 단계에서 사용할 클라이언트 비밀의 Value 속성을 복사합니다.
메모
클라이언트 비밀 값은 앱 등록을 만든 후에 한 번만 표시됩니다. 이 클라이언트 비밀을 무효화하지 않고 더 많은 클라이언트 비밀을 추가할 수 있지만 이 값을 다시 표시할 수 있는 방법은 없습니다.
애플리케이션 서비스 주체에 역할 할당
다음으로, 앱이 어떤 리소스에 필요한 역할(권한)을 결정하고 만든 서비스 주체에 해당 역할을 할당합니다. 역할은 리소스, 리소스 그룹 또는 구독 범위에서 할당할 수 있습니다. 이 예제에서는 대부분의 앱이 모든 Azure 리소스를 단일 리소스 그룹으로 그룹화하므로 리소스 그룹 범위에서 역할을 할당하는 방법을 보여 줍니다.
- Azure 포털
- Azure CLI
Azure Portal에서 앱이 포함된 리소스 그룹의 개요 페이지로 이동합니다.
왼쪽 탐색 영역에서 액세스 제어(IAM) 선택합니다.
액세스 제어(IAM) 페이지에서 + 추가를 선택한 다음, 드롭다운 메뉴에서 역할 할당 추가를 선택합니다. 역할 할당 추가 페이지에서 역할을 구성하고 할당하는 여러 탭을 제공합니다.
역할 탭에서 검색 상자를 사용하여 할당할 역할을 찾습니다. 역할을 선택한 다음 다음 선택합니다.
멤버 탭에서 다음을 확인할 수 있습니다.
- 값에 대한 액세스 권한을 할당하려면 사용자, 그룹 또는 서비스 주체 선택합니다.
- 멤버 값에 대해 + 멤버 선택을 선택하여 "멤버 선택" 플라이아웃 패널을 엽니다.
- 이전에 만든 서비스 주체를 검색하고 필터링된 결과에서 선택합니다. 선택하여 그룹을 선택하고 플라이아웃 패널을 닫습니다.
- 멤버 탭 아래쪽에서 검토 + 할당을 선택합니다.
검토 + 할당 탭에서 검토를 선택하고 페이지 아래쪽에 할당합니다.
앱 환경 변수 설정
런타임에 Azure ID 라이브러리의 특정 자격 증명(예:DefaultAzureCredential
, EnvironmentCredential
및 ClientSecretCredential
)은 환경 변수의 규칙에 따라 서비스 주체 정보를 검색합니다. 도구 및 환경에 따라 .NET으로 작업할 때 환경 변수를 구성하는 방법에는 여러 가지가 있습니다.
선택한 방법에 관계없이 서비스 주체에 대해 다음 환경 변수를 구성합니다.
-
AZURE_CLIENT_ID
: Azure에서 등록된 앱을 식별하는 데 사용됩니다. -
AZURE_TENANT_ID
: Microsoft Entra 테넌트 ID입니다. -
AZURE_CLIENT_SECRET
: 앱에 대해 생성된 비밀 자격 증명입니다.
Visual Studio에서 환경 변수는 프로젝트의 Properties
폴더에 있는 launchsettings.json
파일에 설정할 수 있습니다. 이러한 값은 앱이 시작될 때 자동으로 끌어온다. 그러나 이러한 구성은 배포 중에 앱과 함께 이동하지 않으므로 대상 호스팅 환경에서 환경 변수를 설정해야 합니다.
"profiles": {
"SampleProject": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7177;http://localhost:5177",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"AZURE_CLIENT_ID": "<your-client-id>",
"AZURE_TENANT_ID":"<your-tenant-id>",
"AZURE_CLIENT_SECRET": "<your-client-secret>"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"AZURE_CLIENT_ID": "<your-client-id>",
"AZURE_TENANT_ID":"<your-tenant-id>",
"AZURE_CLIENT_SECRET": "<your-client-secret>"
}
}
}
앱에서 Azure 서비스에 인증
Azure ID 라이브러리 다양한 자격 증명다양한 시나리오 및 Microsoft Entra 인증 흐름을 지원하는 데 맞게 조정된 TokenCredential
구현을 제공합니다. 다음 단계에서는 로컬 및 프로덕션 환경에서 서비스 주체로 작업할 때 ClientSecretCredential 사용하는 방법을 보여 줍니다.
코드 구현
Azure.Identity 패키지를 추가합니다. ASP.NET Core 프로젝트에서는 Microsoft.Extensions.Azure 패키지도 설치합니다.
- 명령줄
- NuGet 패키지 관리자
선택한 터미널에서 애플리케이션 프로젝트 디렉터리로 이동하고 다음 명령을 실행합니다.
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
Azure 서비스는 다양한 Azure SDK 클라이언트 라이브러리의 특수 클라이언트 클래스를 사용하여 액세스합니다. 이러한 클래스 및 사용자 지정 서비스는 종속성 주입을 위해 등록되어야 앱 전체에서 사용할 수 있습니다.
Program.cs
종속성 주입 및 토큰 기반 인증에 대한 클라이언트 클래스를 구성하려면 다음 단계를 완료합니다.
-
using
지시문을 통해Azure.Identity
및Microsoft.Extensions.Azure
네임스페이스를 포함합니다. - 해당
Add
접두사 확장 메서드를 사용하여 Azure 서비스 클라이언트를 등록합니다. -
tenantId
,clientId
및clientSecret
사용하여ClientSecretCredential
구성합니다. -
ClientSecretCredential
인스턴스를UseCredential
메서드에 전달합니다.
builder.Services.AddAzureClients(clientBuilder =>
{
var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new ClientSecretCredential(tenantId, clientId, clientSecret));
});
UseCredential
메서드의 대안은 서비스 클라이언트에 자격 증명을 직접 제공하는 것입니다.
var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
builder.Services.AddSingleton<BlobServiceClient>(_ =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new ClientSecretCredential(tenantId, clientId, clientSecret)));
.NET