Share via


Eine Web-API, die Web-APIs aufruft: Aufrufen einer API

Sobald Sie über ein Token verfügen, können Sie eine geschützte Web-API aufrufen. In der Regel rufen Sie die Downstream-APIs über den Controller oder die Seiten Ihrer Web-API auf.

Controllercode

Wenn Sie Microsoft.Identity.Web verwenden, gibt es drei Verwendungsszenarien:

Option 1: Aufrufen von Microsoft Graph mit dem SDK

In diesem Szenario haben Sie das NuGet-Paket Microsoft.Identity.Web.GraphServiceClient und .AddMicrosoftGraph() in der Datei Startup.cs (wie unter Codekonfiguration angegeben) hinzugefügt, und Sie können den GraphServiceClient direkt in den Controller oder Seitenkonstruktor zur Verwendung in den Aktionen einfügen. Auf der folgenden Razor-Beispielseite wird das Foto des angemeldeten Benutzers angezeigt.

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

Option 2: Aufrufen einer Downstream-Web-API mit der Hilfsklasse

In diesem Szenario haben Sie .AddDownstreamApi() in der Datei Startup.cs (wie unter Codekonfiguration angegeben) hinzugefügt, und Sie können einen IDownstreamWebApi-Dienst direkt in den Controller oder Seitenkonstruktor einfügen und in den Aktionen verwenden:

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

Die CallApiForUserAsync-Methode verfügt auch über stark typisierte generische Überschreibungen, mit denen Sie ein Objekt direkt empfangen können. Beispielsweise wurde mit der folgenden Methode eine Todo-Instanz empfangen, die eine stark typisierte Darstellung der von der Web-API zurückgegebenen JSON ist.

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

Option 3: Aufrufen einer Downstream-Web-API ohne die Hilfsklasse

Wenn Sie einen Autorisierungsheader mithilfe der IAuthorizationHeaderProvider-Schnittstelle abrufen möchten, setzt der folgende Code den Beispielcode fort, der unter Eine Web-API, die Web-APIs aufruft: Abrufen eines Tokens für die App gezeigt ist. Der Code wird in den Aktionen der API-Controller aufgerufen. Er ruft eine nachgelagerte API namens todolist auf.

Nachdem Sie das Token abgerufen haben, können Sie es als Bearertoken zum Aufrufen der nachgelagerten API verwenden.

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

Nächste Schritte

  • Erfahren Sie mehr, indem Sie in der folgenden mehrteiligen Tutorial-Serie eine ASP.NET Core Web-App für die Benutzeranmeldung erstellen.

  • Erkunden von Beispielen für Web-APIs der Microsoft Identitätsplattform