Partilhar via


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, chamas uma API downstream a partir do controlador ou das páginas da tua aplicação 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 em .AddMicrosoftGraph() 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, adicionas AddDownstreamApiStartup.cs conforme especificado em Configuração de código e podes injetar diretamente um IDownstreamApi serviço no teu 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 uma aplicação web ASP.NET Core que permite aos utilizadores iniciar sessão na seguinte série de tutoriais em várias partes

  • Explore exemplos de aplicativos Web da plataforma de identidade da Microsoft