Dela via


En webbapp som anropar webb-API:er: Anropa ett webb-API

Nu när du har en token kan du anropa ett skyddat webb-API. Du anropar vanligtvis ett underordnat API från kontrollanten eller sidorna i webbappen.

Anropa ett skyddat webb-API

Att anropa ett skyddat webb-API beror på ditt språk och valfritt ramverk:

När du använder Microsoft.Identity.Web har du tre användningsalternativ för att anropa ett API:

Alternativ 1: Anropa Microsoft Graph med SDK

I det här scenariot anropar du Microsoft Graph genom att lägga till NuGet-paketet Microsoft.Identity.Web.GraphServiceClient och i .AddMicrosoftGraph()Startup.cs som anges i Kodkonfiguration. Du kan sedan mata in GraphServiceClient styrenheten eller sidkonstruktorn direkt för att använda den i åtgärderna. Följande exempel på Razor-sidan visar bilden på den inloggade användaren.

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

Ett fullständigt exempel finns i ASP.NET Core-webbapp som anropar Microsoft Graph.

Alternativ 2: Anropa ett underordnat webb-API med hjälpklassen

Du vill anropa ett annat webb-API än Microsoft Graph. I så fall lägger du till AddDownstreamApi Startup.cs som anges i Kodkonfiguration, och du kan direkt mata in en IDownstreamApi tjänst i kontrollanten eller sidkonstruktorn och använda den i åtgärderna:

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

Har CallWebApiForUserAsync också starkt inskrivna allmänna åsidosättningar som gör att du kan ta emot ett objekt direkt. Följande metod tar till exempel emot en Todo instans, som är en starkt skriven representation av den JSON som returneras av webb-API:et.

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

Ett fullständigt exempel finns i ASP.NET Core-webbapp som anropar ett API

Alternativ 3: Anropa ett underordnat webb-API utan hjälpklassen

Du har bestämt dig för att hämta en token manuellt med hjälp av IAuthorizationHeaderProvider tjänsten och du måste nu använda token. I så fall fortsätter följande kod exempelkoden som visas i En webbapp som anropar webb-API:er: Hämta en token för appen. Koden anropas i webbappkontrollanternas åtgärder.

När du har hämtat token använder du den som en ägartoken för att anropa det underordnade API:et, i det här fallet 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();
}

Kommentar

Du kan använda samma princip för att anropa alla webb-API:er.

De flesta Azure-webb-API:er tillhandahåller ett SDK som förenklar anropet av API:et, vilket är fallet för Microsoft Graph.

Nästa steg

  • Läs mer genom att skapa en ASP.NET Core-webbapp som loggar in användare i följande självstudieserie i flera delar

  • Utforska Microsofts identitetsplattform webbappexempel