보호된 웹 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();