웹 API를 호출하는 웹앱: 앱에 대한 토큰을 가져오기

클라이언트 애플리케이션 개체를 빌드했습니다. 이제 이를 사용하여 웹 API를 호출하기 위한 토큰을 획득합니다. ASP.NET 또는 ASP.NET Core에서 웹 API 호출은 컨트롤러에서 수행됩니다.

  • 토큰 캐시를 사용하여 웹 API에 대한 토큰을 가져옵니다. 이 토큰을 가져오려면 MSAL(Microsoft 인증 라이브러리) AcquireTokenSilent 메서드(또는 이에 해당하는 Microsoft.Identity.Web의 메서드)를 호출합니다.
  • 보호된 API를 호출하여 액세스 토큰을 매개 변수로 전달합니다.

Microsoft.Identity.Web은 Microsoft Graph 또는 다운스트림 웹 API를 호출하기 위한 편리한 서비스를 제공하는 확장 메서드를 추가합니다. 해당 메서드는 웹 API를 호출하는 웹앱: API 호출에 자세히 설명되어 있습니다. 이러한 도우미 메서드를 사용하면 토큰을 수동으로 가져올 필요가 없습니다.

그러나 토큰을 수동으로 가져오려는 경우 다음 코드는 home 컨트롤러에서 Microsoft.Identity.Web을 사용하여 이 작업을 수행하는 예를 보여 줍니다. 이 코드는 Microsoft Graph SDK 대신 REST API를 사용하여 Microsoft Graph를 호출합니다. 일반적으로 토큰을 가져올 필요는 없으며 요청에 추가할 인증 헤더를 빌드해야 합니다. 인증 헤더를 가져오려면 컨트롤러 생성자(또는 Blazor를 사용하는 경우 페이지 생성자)에서 종속성 삽입을 통해 IAuthorizationHeaderProvider 서비스를 삽입하고 이를 컨트롤러 작업에서 사용합니다. 이 인터페이스에는 프로토콜(전달자, Pop 등)과 토큰이 포함된 문자열을 생성하는 메서드가 있습니다. 사용자를 대신하여 API를 호출하기 위한 인증 헤더를 가져오려면 (CreateAuthorizationHeaderForUserAsync)를 사용합니다. 애플리케이션 자체를 대신하여 다운스트림 API를 호출하기 위한 인증 헤더를 가져오려면 디먼 시나리오에서(CreateAuthorizationHeaderForAppAsync)를 사용합니다.

컨트롤러 메서드는 인증된 사용자만 웹앱을 사용할 수 있도록 하는 [Authorize] 특성에 의해 보호됩니다.

[Authorize]
public class HomeController : Controller
{
 readonly IAuthorizationHeaderProvider authorizationHeaderProvider;

 public HomeController(IAuthorizationHeaderProvider authorizationHeaderProvider)
 {
  this.authorizationHeaderProvider = authorizationHeaderProvider;
 }

 // Code for the controller actions (see code below)

}

ASP.NET Core에서는 종속성 삽입을 통해 IAuthorizationHeaderProvider를 사용할 수 있습니다.

다음은 Microsoft Graph를 호출할 토큰을 가져오는 HomeController 동작의 간소화된 코드입니다.

[AuthorizeForScopes(Scopes = new[] { "user.read" })]
public async Task<IActionResult> Profile()
{
 // Acquire the access token.
 string[] scopes = new string[]{"user.read"};
 string accessToken = await authorizationHeaderProvider.CreateAuthorizationHeaderForUserAsync(scopes);

 // Use the access token to call a protected web API.
 HttpClient client = new HttpClient();
 client.DefaultRequestHeaders.Add("Authorization", accessToken);
 string json = await client.GetStringAsync(url);
}

이 시나리오에 필요한 코드를 더 잘 이해하려면 ms-identity-aspnetcore-webapp-tutorial 자습서의 2단계(2-1-웹앱에서 Microsoft Graph를 호출)를 참조하세요.

컨트롤러 작업 위에 있는 AuthorizeForScopes 특성(Razor 템플릿을 사용하는 경우에는 Razor 템플릿)은 Microsoft.Identity.Web에서 제공합니다. 필요한 경우 사용자에게 증분 방식으로 동의를 요청합니다.

다음과 같은 복잡한 변형도 있습니다.

  • 여러 API 호출
  • 증분 동의 및 조건부 액세스 처리

이러한 고급 단계는 3-WebApp-multi-APIs 자습서의 3장에서 다룹니다.

다음 단계

이 시나리오의 다음 문서로 이동하여 웹 API를 호출합니다.