Condividi tramite


Un'app Web che chiama le API Web: Chiamare un'API Web

Ora che si ha un token, è possibile chiamare un'API Web protetta. In genere si chiama un'API a valle dal controller o dalle pagine della tua app web.

Chiamare un'API Web protetta

La chiamata a un'API Web protetta dipende dal linguaggio e dal framework scelto:

Quando si usa Microsoft.Identity.Web, sono disponibili tre opzioni di utilizzo per chiamare un'API:

Opzione 1: Chiamare Microsoft Graph con l'SDK

In questo scenario si chiama Microsoft Graph aggiungendo il pacchetto NuGet Microsoft.Identity.Web.GraphServiceClient e includendo .AddMicrosoftGraph() in Startup.cs come specificato nella configurazione del codice. È quindi possibile iniettare direttamente il GraphServiceClient nel controller o nel costruttore di pagina per usarlo nelle azioni. Nella pagina Razor di esempio seguente viene visualizzata la foto dell'utente connesso.

[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;
  }
 }
}

Per un esempio completo, vedere applicazione web ASP.NET Core che chiama Microsoft Graph.

Opzione 2: Chiamare un'API Web downstream con la classe helper

Si vuole chiamare un'API Web diversa da Microsoft Graph. In tal caso, si aggiunge AddDownstreamApiStartup.cs come specificato in Configurazione del codice ed è possibile inserire direttamente un IDownstreamApi servizio nel controller o nel costruttore di pagina e usarlo nelle azioni:

[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);
  }
}

Include anche sovrascritture generiche fortemente tipate che ti consentono di ricevere direttamente un oggetto. Ad esempio, il metodo seguente riceve un'istanza Todo , ovvero una rappresentazione fortemente tipizzata del codice JSON restituito dall'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);
    }

Per un esempio completo, vedere ASP.NET'app Web Core che chiama un'API

Opzione 3: Chiamare un'API Web downstream senza la classe helper

Si è deciso di acquisire manualmente un token usando il IAuthorizationHeaderProvider servizio ed è ora necessario usare il token. In tal caso, il codice seguente continua il codice di esempio illustrato in Un'app Web che chiama le API Web: Acquisire un token per l'app. Il codice viene chiamato nelle azioni dei controller della Web App.

Dopo aver acquisito il token, usarlo come token di connessione per chiamare l'API downstream, in questo caso 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

È possibile usare lo stesso principio per chiamare qualsiasi API Web.

La maggior parte delle API Web di Azure offre un SDK che semplifica la chiamata all'API, come avviene per Microsoft Graph.

Passaggi successivi

  • Per saperne di più, crea un'app Web ASP.NET Core che consente l’accesso degli utenti, nella seguente serie di esercitazioni in più parti.

  • Esplorare gli esempi di app Web di Microsoft Identity Platform