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 de Microsoft Graph
- 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, 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