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
- Opción 2: Llamada a una API web de nivel inferior con la clase auxiliar
- Opción 3: Llamada a una API web de nivel inferior sin la clase auxiliar
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