Una API web que llama a las API web: Llamar a una API

Una vez que disponga de un token, puede llamar a una API web protegida. Normalmente, se llama a las API de nivel inferior desde el controlador o las páginas de la API web.

Código del controlador

Cuando se usa Microsoft.Identity.Web, hay tres escenarios de uso:

Opción 1: Llamada a Microsoft Graph con el SDK

En este escenario, agregó el paquete NuGet Microsoft.Identity.Web.GraphServiceClient y añadió .AddMicrosoftGraph() en Startup.cs, tal y como se especifica en Configuración del código, y puede insertar directamente el elemento GraphServiceClient en el controlador o en el constructor de la página para su uso en las acciones. En la siguiente página de Razor de ejemplo se muestra la foto del usuario que inició sesión.

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

Opción 2: Llamada a una API web de nivel inferior con la clase auxiliar

En este escenario, ha agregado .AddDownstreamApi() en el archivo Startup.cs tal y como se especifica en Configuración del código y puede insertar directamente el servicio IDownstreamWebApi en el controlador o en el constructor de la página para su uso en las acciones:

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

El método CallApiForUserAsync también tiene invalidaciones genéricas fuertemente tipadas que permiten recibir directamente un objeto. Por ejemplo, el método siguiente ha recibido una instancia de Todo, que es una representación fuertemente tipada del código JSON devuelto por la API 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);
 }

Opción 3: Llamada a una API web de nivel inferior sin la clase auxiliar

Si ha decidido obtener un encabezado de autorización mediante la interfaz IAuthorizationHeaderProvider, el código siguiente continúa el código de ejemplo que se muestra en una API web que llama a las API web: Adquisición de un token para la aplicación. El código se llama en las acciones de los controladores de API. Llama a una API de nivel inferior denominada todolist.

Una vez que haya adquirido el token, úselo como token de portador para llamar a la API de nivel inferior.

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");
  // ...
}

Pasos siguientes

  • Para más información, cree una aplicación web de ASP.NET Core que inicie sesión a los usuarios en las siguientes series de tutoriales de varias partes

  • Exploración de ejemplos de API web de la plataforma de identidad de Microsoft