다음을 통해 공유


Azure AD B2C를 사용하여 사용자 고유의 웹 API에서 인증 사용

중요합니다

2025년 5월 1일부터 새 고객을 위해 Azure AD B2C를 더 이상 구매할 수 없습니다. FAQ에서 자세히 알아보세요.

웹 API에 대한 액세스 권한을 부여하려면 Azure AD B2C(Azure Active Directory B2C)에서 발급하는 유효한 액세스 토큰을 포함하는 요청만 처리할 수 있습니다. 이 문서에서는 웹 API에 대한 Azure AD B2C 권한 부여를 사용하도록 설정하는 방법을 보여 줍니다. 이 문서의 단계를 완료하면 유효한 액세스 토큰을 얻은 사용자만 웹 API 엔드포인트를 호출할 수 있는 권한이 부여됩니다.

필수 조건

시작하기 전에 웹 API를 호출하는 앱에 대한 인증을 구성하는 방법을 설명하는 다음 문서 중 하나를 읽어보세요. 그런 다음 이 문서의 단계에 따라 샘플 웹 API를 사용자 고유의 웹 API로 바꿉니다.

개요

토큰 기반 인증은 웹 API에 대한 요청에 유효한 액세스 토큰이 포함되도록 합니다.

앱은 다음 단계를 완료합니다.

  1. Azure AD B2C를 사용하여 사용자를 인증합니다.

  2. 웹 API 엔드포인트에 필요한 권한(범위)을 사용하여 액세스 토큰을 획득합니다.

  3. 다음 형식을 사용하여 HTTP 요청의 인증 헤더에 액세스 토큰을 전달자 토큰으로 전달합니다.

    Authorization: Bearer <access token>
    

웹 API는 다음 단계를 완료합니다.

  1. HTTP 요청의 권한 부여 헤더에서 전달자 토큰을 읽습니다.

  2. 토큰의 유효성을 검사합니다.

  3. 토큰의 권한(범위)의 유효성을 검사합니다.

  4. 토큰에 인코딩된 클레임을 읽습니다(선택 사항).

  5. HTTP 요청에 응답합니다.

앱 등록 개요

앱이 Azure AD B2C에 로그인하고 웹 API를 호출할 수 있도록 하려면 Azure AD B2C 디렉터리에 두 개의 애플리케이션을 등록해야 합니다.

  • 웹, 모바일 또는 SPA 애플리케이션 등록을 통해 앱은 Azure AD B2C로 로그인할 수 있습니다. 앱 등록 프로세스는 애플리케이션을 고유하게 식별하는 클라이언트 ID라고도 하는 애플리케이션 ID를 생성합니다(예: 앱 ID: 1).

  • 웹 API 등록을 사용하면 앱에서 보안 웹 API를 호출할 수 있습니다. 등록은 웹 API 권한(범위)을 노출합니다. 앱 등록 프로세스는 웹 API를 고유하게 식별하는 응용 프로그램 ID를 생성합니다(예: 앱 ID: 2). 웹 API 범위(앱 ID: 2)에 대한 앱(앱 ID: 1) 권한을 부여합니다.

애플리케이션 등록 및 애플리케이션 아키텍처는 다음 다이어그램에 설명되어 있습니다.

웹 API를 사용하는 앱에 대한 응용 프로그램 등록 및 응용 프로그램 아키텍처 다이어그램Diagram of the application registrations and the application architecture for an app with web API.

개발 환경 준비

다음 섹션에서는 새 Web API 프로젝트를 만듭니다. 프로그래밍 언어, ASP.NET Core 또는 Node.js선택합니다. 컴퓨터가 다음 소프트웨어 중 하나를 실행하고 있는지 확인합니다.

1단계: 보호된 웹 API 만들기

새 웹 API 프로젝트를 만듭니다. 먼저 사용하려는 프로그래밍 언어( ASP.NET Core 또는 Node.js)를 선택합니다.

dotnet new 명령 사용 이 dotnet new 명령은 웹 API 프로젝트 자산이 있는 TodoList 라는 새 폴더를 만듭니다. 디렉터리를 연 다음 Visual Studio Code를 엽니다.

dotnet new webapi -o TodoList
cd TodoList
code . 

"프로젝트에 필요한 자산을 추가"하라는 메시지가 표시되면 예를 선택합니다.

2단계: 종속성 설치

웹 API 프로젝트에 인증 라이브러리를 추가합니다. 인증 라이브러리는 HTTP 인증 헤더를 구문 분석하고, 토큰의 유효성을 검사하고, 클레임을 추출합니다. 자세한 내용은 라이브러리에 대한 설명서를 검토하세요.

인증 라이브러리를 추가하려면 다음 명령을 실행하여 패키지를 설치합니다.

dotnet add package Microsoft.Identity.Web

3단계: 인증 라이브러리 시작

인증 라이브러리를 시작하는 데 필요한 코드를 추가합니다.

Startup.cs 열고 클래스 시작 부분에 다음 using 선언을 추가합니다.

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

ConfigureServices(IServiceCollection services) 함수를 찾습니다. 그런 다음 코드 줄 앞에 services.AddControllers(); 다음 코드 조각을 추가합니다.

public void ConfigureServices(IServiceCollection services)
{
    // Adds Microsoft Identity platform (Azure AD B2C) support to protect this Api
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(options =>
    {
        Configuration.Bind("AzureAdB2C", options);

        options.TokenValidationParameters.NameClaimType = "name";
    },
    options => { Configuration.Bind("AzureAdB2C", options); });
    // End of the Microsoft Identity platform block    

    services.AddControllers();
}

Configure 함수를 찾습니다. 그런 다음 코드 줄 바로 뒤에 app.UseRouting(); 다음 코드 조각을 추가합니다.

app.UseAuthentication();

변경 후 코드는 다음 스니펫과 같이 표시됩니다.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();
    
    // Add the following line 
    app.UseAuthentication();
    // End of the block you add
    
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

4단계: 엔드포인트 추가

웹 API에 두 개의 엔드포인트를 추가합니다.

  • 익명 /public 끝점. 이 엔드포인트는 현재 날짜와 시간을 반환합니다. 익명 호출을 사용하여 웹 API를 디버그하는 데 사용합니다.
  • 보호된 /hello 엔드포인트. 이 엔드포인트는 액세스 토큰 내의 name 클레임 값을 반환합니다.

익명 엔드포인트를 추가하려면 다음을 수행합니다.

/Controllers 폴더에서 PublicController.cs 파일을 추가한 다음, 다음 코드 조각에 추가합니다.

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace TodoList.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class PublicController : ControllerBase
    {
        private readonly ILogger<PublicController> _logger;

        public PublicController(ILogger<PublicController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public ActionResult Get()
        {
            return Ok( new {date = DateTime.UtcNow.ToString()});
        }
    }
}

보호된 엔드포인트를 추가하려면:

/Controllers 폴더 아래에 HelloController.cs 파일을 추가한 후 다음 코드에 추가합니다.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Identity.Web.Resource;

namespace TodoList.Controllers
{
    [Authorize]
    [RequiredScope("tasks.read")]
    [ApiController]
    [Route("[controller]")]
    public class HelloController : ControllerBase
    {

        private readonly ILogger<HelloController> _logger;
        private readonly IHttpContextAccessor _contextAccessor;

        public HelloController(ILogger<HelloController> logger, IHttpContextAccessor contextAccessor)
        {
            _logger = logger;
            _contextAccessor = contextAccessor;
        }

        [HttpGet]
        public ActionResult Get()
        {
            return Ok( new { name = User.Identity.Name});
        }
    }
}

HelloController 컨트롤러는 인증된 사용자만 액세스할 수 있도록 제한하는 AuthorizeAttribute로 데코레이팅됩니다.

컨트롤러는 또한 [RequiredScope("tasks.read")]로 장식되어 있습니다. RequiredScopeAttribute는 웹 API가 올바른 범위로 tasks.read호출되었는지 확인합니다.

5단계: 웹 서버 구성

개발 환경에서 들어오는 HTTP 또는 HTTPS 요청 포트 번호를 수신하도록 웹 API를 설정합니다. 이 예에서는 HTTP 포트 6000 및 HTTPS 포트 6001을 사용합니다. 웹 API의 기본 URI는 http://localhost:6000 HTTP 및 https://localhost:6001 HTTPS용입니다.

appsettings.json 파일에 다음 JSON 코드 조각을 추가합니다.

"Kestrel": {
    "EndPoints": {
      "Http": {
        "Url": "http://localhost:6000"
      },
      "Https": {
         "Url": "https://localhost:6001"   
        }
    }
  }

6단계: 웹 API 구성

구성 파일에 구성을 추가합니다. 파일에는 Azure AD B2C ID 공급자에 대한 정보가 포함되어 있습니다. 웹 API 앱은 이 정보를 사용하여 웹앱이 전달자 토큰으로 전달하는 액세스 토큰의 유효성을 검사합니다.

프로젝트 루트 폴더에서 appsettings.json 파일을 열고 다음 설정을 추가합니다.

{
  "AzureAdB2C": {
    "Instance": "https://contoso.b2clogin.com",
    "Domain": "contoso.onmicrosoft.com",
    "ClientId": "<web-api-app-application-id>",
    "SignedOutCallbackPath": "/signout/<your-sign-up-in-policy>",
    "SignUpSignInPolicyId": "<your-sign-up-in-policy>"
  },
  // More settings here
}

appsettings.json 파일에서 다음 속성을 업데이트합니다.

섹션 열쇠 가치
AzureAdB2C 인스턴스 Azure AD B2C 테넌트 이름 (예: https://contoso.b2clogin.com)의 첫 번째 부분입니다.
AzureAdB2C 도메인 Azure AD B2C 테넌트 전체 테넌트 이름 (예: contoso.onmicrosoft.com).
AzureAdB2C ClientId 웹 API 애플리케이션 ID입니다. 앞의 다이어그램에서는 App ID: 2가 있는 애플리케이션입니다. 웹 API 애플리케이션 등록 ID를 가져오는 방법을 알아보려면 필수 구성 요소를 참조하세요.
AzureAdB2C 가입로그인정책 ID 사용자 흐름 또는 사용자 지정 정책입니다. 사용자 흐름 또는 정책을 가져오는 방법을 알아보려면 필수 구성 요소를 참조하세요.

7단계: 웹 API 실행 및 테스트

마지막으로, Azure AD B2C 환경 설정을 사용하여 웹 API를 실행합니다.

명령 셸에서 다음 명령을 실행하여 웹앱을 시작합니다.

 dotnet run

다음 출력이 표시되어야 하며, 이는 앱이 실행 중이며 요청을 받을 준비가 되었음을 의미합니다.

Now listening on: http://localhost:6000

프로그램을 중지하려면 명령 셸에서 Ctrl+C를 선택합니다. 명령을 사용하여 앱을 다시 실행할 수 있습니다 node app.js .

팁 (조언)

혹은 dotnet run 명령을 실행하려면 Visual Studio Code 디버거를 사용할 수 있습니다. Visual Studio Code의 기본 제공 디버거는 편집, 컴파일 및 디버그 루프를 가속화하는 데 도움이 됩니다.

브라우저를 열고 http://localhost:6000/public으로 이동합니다. 브라우저 창에 현재 날짜 및 시간과 함께 다음 텍스트가 표시되어야 합니다.

8단계: 앱에서 웹 API 호출

액세스 토큰 없이 보호된 웹 API 엔드포인트를 호출해 보세요. 브라우저를 열고 http://localhost:6000/hello으로 이동합니다. API는 웹 API가 전달자 토큰으로 보호되고 있음을 확인하는 무단 HTTP 오류 메시지를 반환합니다.

웹 API를 호출하도록 앱을 계속 구성합니다. 지침은 필수 구성 요소 섹션을 참조하세요.

Azure AD B2C를 API와 통합할 때의 몇 가지 모범 사례에 대해 알아보려면 이 비디오를 시청하세요.

GitHub에서 전체 예제를 확인하세요.