Um aplicativo Web que chama APIs da Web: chame uma API da Web

Agora que você tem um token, pode chamar uma API da Web protegida. Normalmente, você chama uma API downstream do controlador ou das páginas do seu aplicativo Web.

Chamar uma API da Web protegida

Chamar uma API da Web protegida depende do seu idioma e da estrutura de sua escolha:

Ao usar Microsoft.Identity.Web, você tem três opções de uso para chamar uma API:

Opção 1: Chamar o Microsoft Graph com o SDK

Nesse cenário, você chama o Microsoft Graph adicionando o pacote NuGet Microsoft.Identity.Web.GraphServiceClient e incluindo .AddMicrosoftGraph() em Startup.cs conforme especificado na configuração de código. Você pode então injetar diretamente o GraphServiceClient em seu controlador ou construtor de página para usá-lo 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;
  }
 }
}

Para obter um exemplo completo, consulte ASP.NET aplicativo Web principal que chama o Microsoft Graph.

Opção 2: Chamar uma API da Web downstream com a classe auxiliar

Você deseja chamar uma API da Web diferente do Microsoft Graph. Nesse caso, você adiciona AddDownstreamApiStartup.cs conforme especificado em Configuração de código e pode injetar diretamente um IDownstreamApi 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 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);
  }
}

O CallWebApiForUserAsync também tem substituições genéricas fortemente tipadas que permitem que você receba diretamente um objeto. Por exemplo, o método a seguir recebe 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 _downstreamApi.CallApiForUserAsync<object, Todo>(
            ServiceName,
            null,
            options =>
            {
                options.HttpMethod = HttpMethod.Get;
                options.RelativePath = $"api/todolist/{id}";
            });
        return View(value);
    }

Para obter um exemplo completo, consulte ASP.NET aplicativo Web principal que chama uma API

Opção 3: Chamar uma API da Web downstream sem a classe auxiliar

Você decidiu adquirir um token manualmente usando o IAuthorizationHeaderProvider serviço, e agora você precisa usar o token. Nesse caso, o código a seguir continua o código de exemplo mostrado em Um aplicativo Web que chama APIs da Web: Adquira um token para o aplicativo. O código é chamado nas ações dos controladores de aplicativos Web.

Depois de adquirir o token, use-o como um token de portador para chamar a API downstream, neste caso o 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

Você pode usar o mesmo princípio para chamar qualquer API da Web.

A maioria das APIs Web do Azure fornece um SDK que simplifica a chamada da API, como é o caso do Microsoft Graph.

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 aplicativos Web da plataforma de identidade da Microsoft