Share via


Aplicación web que llama a las API web: Llamada a una API de web

Ahora que dispone de un token, puede llamar a una API web protegida. Normalmente, se llama a una API de nivel inferior desde el controlador o las páginas de la aplicación web.

Llamada a una API web protegida

La llamada a una API web protegida depende del lenguaje y el marco elegidos:

Cuando se usa Microsoft.Identity.Web, hay tres opciones de uso para llamar a una API:

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

En este escenario, llamará a Microsoft Graph agregando el paquete NuGet Microsoft.Identity.Web.GraphServiceClient e incluyendo .AddMicrosoftGraph() en Startup.cs tal como se especifica en Configuración de código. A continuación, puede insertar directamente GraphServiceClient en el controlador o constructor de página para usarlo 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;
  }
 }
}

Para obtener un ejemplo completo, consulte la aplicación web de ASP.NET Core que llama a Microsoft Graph.

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

Desea llamar a una API web que no es Microsoft Graph. En ese caso, 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 IDownstreamApi en el controlador o en el constructor de la página y usarlo en las acciones:

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

  public TodoListController(IDownstreamApi downstreamApi)
  {
    _downstreamApi = downstreamApi;
  }

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

CallWebApiForUserAsync también tiene invalidaciones genéricas fuertemente tipadas que permiten recibir directamente un objeto. Por ejemplo, el método siguiente recibe 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 _downstreamApi.CallApiForUserAsync<object, Todo>(
            ServiceName,
            null,
            options =>
            {
                options.HttpMethod = HttpMethod.Get;
                options.RelativePath = $"api/todolist/{id}";
            });
        return View(value);
    }

Para obtener un ejemplo completo, consulte la aplicación web de ASP.NET Core que llama a una API

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

Ha decidido adquirir un token manualmente mediante el servicio IAuthorizationHeaderProvider y ahora debe usar el token. En ese caso, el código siguiente continúa el código de ejemplo que se muestra en Aplicación web que llama a las API web: Adquisición de un token para la aplicación. Se llama al código en las acciones de los controladores de la aplicación web.

Una vez que haya adquirido el token, úselo como token de portador para llamar a la API de nivel inferior, que en este caso es Microsoft Graph.

public async Task<IActionResult> Profile()
{
  // Acquire the access token.
  string[] scopes = new string[]{"user.read"};
  string authorizationHeader = await IAuthorizationHeaderProvider.GetAuthorizationHeaderForUserAsync(scopes);

  // Use the access token to call a protected web API.
  HttpClient httpClient = new HttpClient();
  client.DefaultRequestHeaders.Add("Authorization", authorizationHeader);

  var response = await httpClient.GetAsync($"{webOptions.GraphApiUrl}/beta/me");

  if (response.StatusCode == HttpStatusCode.OK)
  {
    var content = await response.Content.ReadAsStringAsync();

    dynamic me = JsonConvert.DeserializeObject(content);
    ViewData["Me"] = me;
  }

  return View();
}

Nota:

Puede usar el mismo principio para llamar a cualquier API web.

La mayoría de las API web de Azure proporcionan un SDK que simplifica la llamada a la API, como en el caso de Microsoft Graph.

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 aplicaciones web de la plataforma de identidad de Microsoft