웹 API에 대한 액세스 권한을 부여하려면 Azure AD B2C(Azure Active Directory B2C)가 발급한 유효한 액세스 토큰을 포함하는 요청만 제공할 수 있습니다. 이 문서에서 웹 API에 대한 Azure AD B2C 권한 부여를 사용 하는 방법을 보여줍니다. 이 문서의 단계들을 완료 한 후에는 유효한 액세스 토큰을 획득 한 사용자에게만 웹 API 엔드포인트를 호출할 수 있는 권한이 부여 됩니다.
필수 조건
시작 하기 전에 웹 API를 호출 하는 앱에 대한 인증을 구성하는 방법에 대해 설명 하는 다음 문서 중 하나를 참조하세요. 그 후 샘플 웹 API를 고유 웹 API로 바꾸기 위한 단계들을 따르세요.
토큰 기반 인증은 웹 API에 대한 요청에 유효한 액세스 토큰이 포함되어 있는지 확인합니다.
앱은 다음 단계를 완료합니다.
Azure AD B2C를 사용하는 사용자를 인증합니다.
웹 API 엔드포인트에 대해 필요한 권한(범위)이 포함된 액세스 토큰을 가져옵니다.
다음 형식을 사용하여 HTTP 요청의 인증 헤더에서 전달자 토큰으로 액세스 토큰을 전달 합니다.
HTTP
Authorization: Bearer <access token>
웹 API는 다음 단계를 완료합니다.
HTTP 요청의 인증 헤더에서 전달자 토큰을 읽습니다.
이는 토큰의 유효성을 검사합니다.
토큰에서 사용 권한(범위)의 유효성을 검사합니다.
토큰에서 인코딩된 클레임을 읽습니다(선택 사항).
이는 HTTP 요청에 응답합니다.
앱 등록 개요
앱이 Azure AD B2C에 로그인하고 웹 API를 호출할 수 있도록 하려면 Azure AD B2C 디렉터리에 두 개의 애플리케이션을 등록해야 합니다.
웹 혹은 모바일 또는 단일 페이지 어플리케이션 등록을 사용하면 앱이 Azure AD B2C로 로그인할 수 있습니다. 앱 등록 프로세스는 클라이언트 ID라고도 불리는 앱을 고유하게 식별하는 는 애플리케이션 ID를 생성합니다(예시 앱 ID: 1).
웹 API 등록을 사용하면 앱에서 보안 웹 API를 호출할 수 있습니다. 등록은 웹 API 권한(범위)을 노출합니다. 앱 등록 프로세스는 웹 API를 고유하게 식별하는 애플리케이션 ID를 생성합니다(예시 앱 ID: 2). 웹 API 범위(앱 ID: 2)에 앱(앱 ID: 1) 권한을 부여합니다.
응용 프로그램 등록 및 응용 프로그램 아키텍처는 다음 다이어그램에 설명 되어 있습니다.
개발 환경 준비
다음 섹션에서는 새로운 웹 API 프로젝트를 만듭니다. ASP.NET Core 또는 Node.js 프로그래밍 언어를 선택 합니다. 다음 소프트웨어 중 하나를 실행하는 컴퓨터가 있어야 합니다.
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
ConfigureServices(IServiceCollection services) 함수를 찾습니다. 그런 다음 services.AddControllers();코드 줄 앞에 다음 코드 조각을 추가 합니다.
C#
publicvoidConfigureServices(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();코드 줄 바로 뒤에 다음 코드 조각을 추가합니다.
C#
app.UseAuthentication();
변경 후에 코드는 다음 코드 조각과 같아야 합니다.
C#
publicvoidConfigure(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();
});
}
다음 JavaScript 코드를 app.js 파일에 추가합니다.
JavaScript
// Import the required librariesconst express = require('express');
const morgan = require('morgan');
const passport = require('passport');
const config = require('./config.json');
// Import the passport Azure AD libraryconst BearerStrategy = require('passport-azure-ad').BearerStrategy;
// Set the Azure AD B2C optionsconst options = {
identityMetadata: `https://${config.credentials.tenantName}.b2clogin.com/${config.credentials.tenantName}.onmicrosoft.com/${config.policies.policyName}/${config.metadata.version}/${config.metadata.discovery}`,
clientID: config.credentials.clientID,
audience: config.credentials.clientID,
issuer: config.credentials.issuer,
policyName: config.policies.policyName,
isB2C: config.settings.isB2C,
scope: config.resource.scope,
validateIssuer: config.settings.validateIssuer,
loggingLevel: config.settings.loggingLevel,
passReqToCallback: config.settings.passReqToCallback
}
// Instantiate the passport Azure AD library with the Azure AD B2C optionsconst bearerStrategy = new BearerStrategy(options, (token, done) => {
// Send user info using the second argument
done(null, { }, token);
}
);
// Use the required librariesconst app = express();
app.use(morgan('dev'));
app.use(passport.initialize());
passport.use(bearerStrategy);
//enable CORS (for testing only -remove in production/deployment)
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Authorization, Origin, X-Requested-With, Content-Type, Accept');
next();
});
네 번째 단계에서 엔드포인트를 추가합니다.
웹 API에 두 개의 엔드포인트들을 추가합니다.
익명의 /public엔드포인트 이 엔드포인트는 현재 날짜 및 시간을 반환합니다. 익명 호출을 사용하여 웹 API를 디버깅 하는 데 사용합니다.
보호된 /hello엔드포인트 이 엔드포인트는 name액세스 토큰 내의 클레임 값을 반환 합니다.
/Controllers 폴더 아래에 HelloController.cs 파일을 추가하고 다음 코드에 추가합니다.
C#
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Identity.Web.Resource;
namespaceTodoList.Controllers
{
[Authorize]
[RequiredScope("tasks.read")]
[ApiController]
[Route("[controller]")]
publicclassHelloController : ControllerBase
{
privatereadonly ILogger<HelloController> _logger;
privatereadonly IHttpContextAccessor _contextAccessor;
publicHelloController(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 합니다.
app.js 파일에서 다음 JavaScript 코드를 추가합니다.
JavaScript
// API protected endpoint
app.get('/hello',
passport.authenticate('oauth-bearer', {session: false}),
(req, res) => {
console.log('Validated claims: ', req.authInfo);
// Service relies on the name claim.
res.status(200).json({'name': req.authInfo['name']});
}
);
함수는 /hello엔드포인트가 먼저 호출합니다passport.authenticate(). 인증 함수는 인증된 사용자에 대한 액세스만 제한합니다.
또한 인증 함수는 웹 API가 올바른 범위로 호출되는지 확인합니다. 허용된 범위는 구성 파일에 있습니다.
다섯 번째 단계에서는 웹 서버 구성을 합니다.
개발 환경에서 들어오는 HTTP 또는 HTTPS 요청 포트 번호에서 수신 대기하도록 웹 API를 설정합니다. 이 예제에서는 HTTP 포트 6000 및 HTTPS 포트 6001을 사용합니다. 웹 API의 기본 URI는 HTTP에 대해서 http://localhost:6000이며 HTTPS에 대해서 https://localhost:6001입니다.
Azure AD B2C 테넌트 이름/도메인 이름(예: contoso.onmicrosoft.com).
credentials
clientID
웹 API 애플리케이션 ID입니다. 위의 다이어그램에서 애플리케이션은 앱 ID: 2가 있습니다. 웹 API 애플리케이션 등록 ID를 얻는 방법을 알아보려면 필수 요구 사항을 참조하세요.
credentials
issuer
토큰 발급자가 값을 iss 클레임 합니다. 기본적으로 Azure AD B2C https://<your-tenant-name>.b2clogin.com/<your-tenant-ID>/v2.0/ 형식으로 토큰을 반환합니다. Azure AD B2C 테넌트 이름의 첫번째 부분을 <your-tenant-name>로 바꿉니다. <your-tenant-ID>을 Azure AD B2C 테넌트 ID로 바꿉니다.
정책
policyName
사용자 흐름 또는 사용자 지정 정책입니다. 사용자 흐름 또는 정책을 얻는 방법을 알아보려면 필수 요구 사항을 참조하세요.
resource
scope
웹 API 애플리케이션 등록의 범위입니다. 웹 API 범위를 얻는 방법을 알아보려면 필수 구성 요소를 알아보세요.
작업용 앱을 빌드할 때 일반적으로 보안 API와 통합됩니다. API를 보호하는 두 가지 일반적인 방법인 API 키 및 OAuth2와 Microsoft 365 Copilot 실행되는 선언적 에이전트에 대한 API 플러그 인을 빌드할 때 API와 통합하는 방법에 대해 알아봅니다.