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
- Opção 2: Chamar uma API da Web downstream com a classe auxiliar
- Opção 3: Chamar uma API da Web downstream sem a classe auxiliar
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