Uma API Web que chama APIs Web: adquirir um token para o aplicativo

Você criou o objeto de aplicativo cliente. Agora, você o usará para adquirir um token para chamar uma API Web. No ASP.NET ou ASP.NET Core, a chamada de uma API Web é feita no controlador:

  • Obtenha um token para a API Web usando o cache de token. Para obter esse token, chame o método AcquireTokenSilent da MSAL (Biblioteca de Autenticação da Microsoft) (ou o equivalente em Microsoft.Identity.Web).
  • Chame a API protegida, passando o token de acesso para ele como um parâmetro.

Microsoft.Identity.Web adiciona métodos de extensão que fornecem serviços de conveniência para chamar o Microsoft Graph ou uma API Web downstream. Esses métodos são explicados em detalhes em Um aplicativo Web que chama APIs Web: chamar uma API. Com esses métodos auxiliares, não será necessário adquirir um token manualmente.

No entanto, se você quiser adquirir um token manualmente, o código a seguir mostra um exemplo de como usar Microsoft.Identity.Web para fazer isso em um controlador doméstico. Ele chama o Microsoft Graph usando a API REST (em vez do SDK do Microsoft Graph). Normalmente, você não precisa obter um token, você precisa criar um cabeçalho de autorização para adicionar à sua solicitação. Para obter um cabeçalho de autorização, injete o serviço IAuthorizationHeaderProvider por dependência em seu construtor do controlador (ou seu construtor de página, se você usar o Blazor) e use-o em suas ações de controlador. Essa interface tem métodos que produzem uma cadeia de caracteres que contém o protocolo (Portador, Pop, ...) e um token. Para obter um cabeçalho de autorização para chamar uma API em nome do usuário, use (CreateAuthorizationHeaderForUserAsync). Para obter um cabeçalho de autorização para chamar uma API downstream em nome do próprio aplicativo, em um cenário de daemon, use (CreateAuthorizationHeaderForAppAsync).

Os métodos do controlador são protegidos por um atributo [Authorize] que garante que somente usuários autenticados possam usar o aplicativo Web.

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

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

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

}

O ASP.NET Core disponibiliza IAuthorizationHeaderProvider por injeção de dependência.

Aqui está o código simplificado para a ação do HomeController, que obtém um token para chamar o Microsoft Graph:

[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);
}

Para entender melhor o código necessário para esse cenário, consulte a etapa (2-1-Aplicativo Web chama o Microsoft Graph) da fase 2 do tutorial ms-identity-aspnetcore-webapp-tutorial.

O atributo AuthorizeForScopes sobre a ação do controlador (ou da página Razor se você usar um modelo Razor) é fornecido pelo Microsoft.Identity.Web. Ele garante que o usuário seja solicitado a dar consentimento, se necessário, e incrementalmente.

Há outras variações complexas, tais como:

  • Chamar várias APIs.
  • Processamento de consentimento incremental e acesso condicional.

Essas etapas avançadas são abordadas no capítulo 3 do tutorial 3-WebApp-multi-APIs.

Próximas etapas

Vá para o próximo artigo neste cenário, Chamar uma API Web.