보호된 웹 API: 코드 구성

보호된 웹 API에 대한 코드를 구성하려면 다음을 이해합니다.

  • API를 보호된 항목으로 정의하는 것
  • 전달자 토큰을 구성하는 방법
  • 토큰의 유효성을 검사하는 방법

ASP.NET 및 ASP.NET Core API를 보호된 항목으로 정의하는 것은 무엇인가요?

웹앱과 마찬가지로 ASP.NET 및 ASP.NET Core 웹 API는 해당 컨트롤러 작업에 [Authorize] 특성이 접두사로 추가되기 때문에 보호됩니다. 권한 있는 ID를 사용하여 API를 호출하는 경우에만 컨트롤러 작업을 호출할 수 있습니다.

다음 질문을 살펴보세요.

  • 앱만 웹 API를 호출할 수 있습니다. API를 호출하는 앱의 ID를 API가 어떻게 알 수 있나요?
  • 앱이 사용자를 대신하여 API를 호출하는 경우 사용자의 ID는 무엇인가요?

전달자 토큰

앱이 호출될 때 헤더에 설정된 전달자 토큰에는 앱 ID에 대한 정보가 포함됩니다. 웹앱이 디먼 앱에서 서비스 간 호출을 허용하지 않는 한, 사용자에 대한 정보도 포함됩니다.

다음은 .NET용 Microsoft 인증 라이브러리(MSAL.NET)를 사용하여 토큰을 얻은 후 API를 호출하는 클라이언트를 보여 주는 C# 코드 예제입니다.

var scopes = new[] {$"api://.../access_as_user"};
var result = await app.AcquireToken(scopes)
                      .ExecuteAsync();

httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);

// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);

Important

클라이언트 애플리케이션은 웹 API의Microsoft ID 플랫폼에 전달자 토큰을 요청합니다. API는 토큰을 확인하고 포함된 클레임을 확인해야 하는 유일한 애플리케이션입니다. 클라이언트 앱은 토큰의 클레임을 조사하려고 해서는 안 됩니다.

이후에 웹 API에서 토큰 암호화를 요구할 수 있습니다. 이 요구 사항은 액세스 토큰을 볼 수 있는 클라이언트 앱의 액세스를 방지합니다.

JwtBearer 구성

이 섹션에서는 전달자 토큰을 구성하는 방법을 설명합니다.

Config 파일

단일 테넌트(기간 업무 앱)에서 액세스 토큰을 허용하려는 경우에만 TenantId를 지정해야 합니다. 그렇지 않으면 common으로 남아 있을 수 있습니다. 다른 값은 다음과 같을 수 있습니다.

  • GUID(테넌트 ID = 디렉터리 ID)
  • common은 조직 및 개인 계정일 수 있음
  • organizations는 임의 조직일 수 있음
  • consumers는 Microsoft 개인 계정임
{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "Enter_the_Application_(client)_ID_here",
    "TenantId": "common"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

웹 API에 대한 사용자 지정 앱 ID URI 사용

Azure Portal에서 제안한 기본 앱 ID URI를 수락한 경우 대상 그룹을 지정할 필요가 없습니다(애플리케이션 ID URI 및 범위 참조). 그렇지 않은 경우에는 웹 API의 앱 ID URI가 값으로 지정된 Audience 속성을 추가합니다. 일반적으로 api://로 시작합니다.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "Enter_the_Application_(client)_ID_here",
    "TenantId": "common",
    "Audience": "Enter_the_Application_ID_URI_here"
  },
}

코드 초기화

[권한 부여] 특성이 포함된 컨트롤러 작업에 대해 앱이 호출되면 ASP.NET 및 ASP.NET Core가 권한 부여 헤더의 전달자 토큰에서 액세스 토큰을 추출합니다. 그런 다음, 액세스 토큰이 JwtBearer 미들웨어로 전달되고, 이 미들웨어에서 .NET용 Microsoft IdentityModel 확장을 호출합니다.

Microsoft.Identity.Web

ASP.NET Core를 사용하여 웹 API를 개발하는 경우에는 Microsoft.Identity.Web NuGet 패키지를 사용하는 것이 좋습니다.

Microsoft.Identity.Web은 ASP.NET Core, 인증 미들웨어 및 .NET용 MSAL(Microsoft 인증 라이브러리) 간의 붙이기를 제공합니다. 더 명확하고, 더 강력한 개발자 환경을 지원하고 Microsoft ID 플랫폼과 Azure AD B2C의 강점을 활용합니다.

.NET 6.0용 ASP.NET

Microsoft.Identity.Web을 사용하는 새 웹 API 프로젝트를 만들려면 .NET 6.0 CLI 또는 Visual Studio에서 프로젝트 템플릿을 사용합니다.

Dotnet core CLI

# Create new web API that uses Microsoft.Identity.Web
dotnet new webapi --auth SingleOrg

Visual Studio - Visual Studio에서 Web API 프로젝트를 만들려면 파일>새로 만들기>프로젝트>ASP.NET Core 웹 API를 차례로 선택합니다.

.NET CLI 및 Visual Studio 프로젝트 템플릿은 모두 이 코드 조각과 비슷한 Program.cs 파일을 만듭니다. Microsoft.Identity.Web using 지시문과 인증 및 권한 부여가 포함된 줄을 확인합니다.

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();