Partilhar via


Uma API da Web que chama APIs da Web: chame uma API

Depois de ter um token, você pode chamar uma API da Web protegida. Você geralmente chama as APIs downstream do controlador ou das páginas da sua API da Web.

Código do controlador

Quando você usa Microsoft.Identity.Web, você tem três cenários de uso:

Opção 1: Chamar o Microsoft Graph com o SDK

Nesse cenário, você adicionou o pacote NuGet Microsoft.Identity.Web.GraphServiceClient e adicionou .AddMicrosoftGraph() Startup.cs conforme especificado em Configuração de código, e pode injetar diretamente o GraphServiceClient no controlador ou construtor de página para uso nas ações. A página Razor de exemplo a seguir exibe a foto do usuário conectado.

 [Authorize]
 [AuthorizeForScopes(Scopes = new[] { "user.read" })]
 public class IndexModel : PageModel
 {
     private readonly GraphServiceClient _graphServiceClient;

     public IndexModel(GraphServiceClient graphServiceClient)
     {
         _graphServiceClient = graphServiceClient;
     }

     public async Task OnGet()
     {
         var user = await _graphServiceClient.Me.GetAsync();
         try
         {
             using (var photoStream = await _graphServiceClient.Me.Photo.Content.GetAsync())
             {
                 byte[] photoByte = ((MemoryStream)photoStream).ToArray();
                 ViewData["photo"] = Convert.ToBase64String(photoByte);
             }
             ViewData["name"] = user.DisplayName;
         }
         catch (Exception)
         {
             ViewData["photo"] = null;
         }
     }
 }

Opção 2: Chamar uma API da Web downstream com a classe auxiliar

Nesse cenário, você adicionou .AddDownstreamApi() Startup.cs conforme especificado em Configuração de código e pode injetar diretamente um IDownstreamWebApi serviço em seu controlador ou construtor de página e usá-lo nas ações:

 [Authorize]
 [AuthorizeForScopes(ScopeKeySection = "TodoList:Scopes")]
 public class TodoListController : Controller
 {
     private IDownstreamWebApi _downstreamWebApi;
     private const string ServiceName = "TodoList";

     public TodoListController(IDownstreamWebApi downstreamWebApi)
     {
         _downstreamWebApi = downstreamWebApi;
     }

     public async Task<ActionResult> Details(int id)
     {
         var value = await _downstreamWebApi.CallApiForUserAsync(
             ServiceName,
             options =>
             {
                 options.RelativePath = $"me";
             });
         return View(value);
     }

O CallApiForUserAsync método também tem substituições genéricas fortemente tipadas que permitem que você receba diretamente um objeto. Por exemplo, o método a seguir recebeu uma Todo instância, que é uma representação fortemente tipada do JSON retornado pela API da Web.

 // GET: TodoList/Details/5
 public async Task<ActionResult> Details(int id)
 {
     var value = await _downstreamWebApi.CallApiForUserAsync<object, Todo>(
         ServiceName,
         null,
         options =>
         {
             options.HttpMethod = HttpMethod.Get;
             options.RelativePath = $"api/todolist/{id}";
         });
     return View(value);
 }

Opção 3: Chamar uma API da Web downstream sem a classe auxiliar

Se você decidiu obter um cabeçalho de autorização usando a IAuthorizationHeaderProvider interface, o código a seguir continua o código de exemplo mostrado em Uma API da Web que chama APIs da Web: Adquira um token para o aplicativo. O código é chamado nas ações dos controladores de API. Ele chama uma API downstream chamada todolist.

Depois de adquirir o token, use-o como um token de portador para chamar a API downstream.

private async Task CallTodoListService(string accessToken)
{
  // After the token has been returned by Microsoft.Identity.Web, add it to the HTTP authorization header before making the call to access the todolist service.
  authorizationHeader = await authorizationHeaderProvider.GetAuthorizationHeaderForUserAsync(scopes);
  _httpClient.DefaultRequestHeaders["Authorization"] = authorizationHeader;

  // Call the todolist service.
  HttpResponseMessage response = await _httpClient.GetAsync(TodoListBaseAddress + "/api/todolist");
  // ...
}

Próximos passos

  • Saiba mais criando um aplicativo Web ASP.NET Core que inicia sessão nos utilizadores na seguinte série de tutoriais com várias partes

  • Explore exemplos de API da Web da plataforma de identidade da Microsoft