Een web-API die web-API's aanroept: codeconfiguratie

Zodra de registratie voor een web-API is voltooid, kan de toepassingscode worden geconfigureerd. Het configureren van een web-API voor het aanroepen van een downstream-web-API bouwt voort op de code die wordt gebruikt voor het beveiligen van een web-API. Zie Beveiligde web-API: app-configuratie voor meer informatie.

Microsoft.Identity.Web

Microsoft raadt u aan het NuGet-pakket Microsoft.Identity.Web te gebruiken bij het ontwikkelen van een met ASP.NET Core beveiligde API die downstream-web-API's aanroept. Zie Beveiligde web-API: codeconfiguratie | Microsoft.Identity.Web voor een snelle presentatie van die bibliotheek in de context van een web-API.

Clientgeheimen of clientcertificaten

Aangezien uw web-app nu een downstream-web-API aanroept, geeft u een clientgeheim of clientcertificaat op in het bestand appsettings.json. U kunt ook een sectie toevoegen die het volgende aangeeft:

  • De URL van de downstream web-API
  • De bereiken die nodig zijn voor het aanroepen van de API

In het volgende voorbeeld geeft de GraphBeta sectie deze instellingen op.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
    {
      "SourceType": "ClientSecret",
      "ClientSecret":"[Enter_the_Client_Secret_Here]"
    }
  ]
 },
 "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
    }
}

Notitie

U kunt een verzameling clientreferenties voorstellen, waaronder een oplossing zonder referenties, zoals federatie van workloadidentiteit voor Azure Kubernetes. Vorige versies van Microsoft.Identity.Web hebben het clientgeheim uitgedrukt in één eigenschap ClientSecret in plaats van ClientCredentials. Dit wordt nog steeds ondersteund voor compatibiliteit met eerdere versies, maar u kunt niet zowel de eigenschap ClientSecret als de verzameling ClientCredentials gebruiken.

In plaats van een clientgeheim kunt u een clientcertificaat opgeven. Het volgende codefragment toont het gebruik van een certificaat dat is opgeslagen in Azure Key Vault.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
        "KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
      }
   ]
  },
  "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
  }
}

Waarschuwing

Als u vergeet de Scopes in een matrix te wijzigen, wordt wanneer u de IDownstreamApi bereiken probeert te gebruiken null weergegeven en IDownstreamApi wordt geprobeerd een anonieme (niet-geverifieerde) aanroep naar de downstream-API uit te voeren, wat resulteert in een 401/unauthenticated.

Microsoft.Identity.Web biedt verschillende manieren om certificaten te beschrijven, zowel op configuratie als op code. Zie Microsoft.Identity.Web - Certificaten gebruiken op GitHub voor meer informatie.

Program.cs

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

Een web-API moet een token verkrijgen voor de downstream-API. Geef deze op door de .EnableTokenAcquisitionToCallDownstreamApi() regel erna .AddMicrosoftIdentityWebApi(Configuration)toe te voegen. Deze regel bevat de ITokenAcquisition service die kan worden gebruikt in de acties controller/pagina's.

Een alternatieve methode is echter het implementeren van een tokencache. Als u bijvoorbeeld aan Program.cs kunt toevoegen.AddInMemoryTokenCaches(), kan het token in de cache worden opgeslagen in het geheugen.

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

Microsoft.Identity.Web biedt twee mechanismen voor het aanroepen van een downstream-web-API vanuit een andere API. De optie die u kiest, is afhankelijk van of u Microsoft Graph of een andere API wilt aanroepen.

Optie 1: Microsoft Graph aanroepen

Als u Microsoft Graph wilt aanroepen, kunt u met Microsoft.Identity.Web de GraphServiceClient API-acties rechtstreeks gebruiken (beschikbaar gesteld door de Microsoft Graph SDK).

Notitie

Er is een doorlopend probleem met Microsoft Graph SDK v5+. Raadpleeg het GitHub-probleem voor meer informatie.

Microsoft Graph beschikbaar maken:

  1. Voeg het NuGet-pakket Microsoft.Identity.Web.GraphServiceClient toe aan het project.
  2. Voeg .AddMicrosoftGraph() na .EnableTokenAcquisitionToCallDownstreamApi() in Program.cs toe. .AddMicrosoftGraph() heeft verschillende onderdrukkingen. Als u de onderdrukking gebruikt die een configuratiesectie als parameter gebruikt, wordt de code:
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
    .AddInMemoryTokenCaches();
// ...

Optie 2: een andere downstream web-API aanroepen dan Microsoft Graph

  1. Voeg het NuGet-pakket Microsoft.Identity.Web.DownstreamApi toe aan het project.
  2. Voeg .AddDownstreamApi() na .EnableTokenAcquisitionToCallDownstreamApi() in Program.cs toe. De code wordt:
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddInMemoryTokenCaches();
// ...

Waar;

  • MyApi geeft de naam aan van de downstream-web-API die uw web-API wil aanroepen
  • MyApiScope is het bereik dat nodig is om uw web-API aan te vragen om te communiceren met de downstream-web-API

Deze waarden worden weergegeven in uw JSON die vergelijkbaar is met het volgende codefragment.

"DownstreamAPI": {
      "BaseUrl": "https://downstreamapi.contoso.com/",
      "Scopes": "user.read"
    },

Als de web-app een andere API-resource moet aanroepen, herhaalt u de .AddDownstreamApi() methode met het relevante bereik, zoals wordt weergegeven in het volgende fragment:

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddDownstreamApi("MyApi2", Configuration.GetSection("MyApi2Scope"))
    .AddInMemoryTokenCaches();
// ...

Houd er rekening mee dat zonder .EnableTokenAcquisitionToCallDownstreamApi parameter wordt aangeroepen, wat betekent dat het toegangstoken net op tijd wordt verkregen wanneer de controller het token aanvraagt door het bereik op te geven.

Het bereik kan ook worden doorgegeven tijdens het aanroepen .EnableTokenAcquisitionToCallDownstreamApi, waardoor de web-app het token verkrijgt tijdens de initiële aanmelding van de gebruiker zelf. Het token wordt vervolgens opgehaald uit de cache wanneer de controller dit aanvraagt.

Net als bij web-apps kunnen verschillende tokencache-implementaties worden gekozen. Zie Microsoft.Identity.Web - Serialisatie van tokencache op GitHub voor meer informatie.

In de volgende afbeelding ziet u de mogelijkheden van Microsoft.Identity.Web en de impact op Program.cs:

Block diagram showing service configuration options in startup dot C S for calling a web API and specifying a token cache implementation

Notitie

Om de codevoorbeelden hier volledig te begrijpen, moet u vertrouwd zijn met ASP.NET Core basisprincipes en met name met afhankelijkheidsinjectie en opties.

U kunt ook een voorbeeld zien van de implementatie van een OBO-stroom in Node.js en Azure Functions.

Protocol

Zie het Microsoft-identiteitsplatform en de Namens-stroom voor OAuth 2.0 voor meer informatie over het OBO-protocol.

Volgende stappen

Ga verder met het volgende artikel in dit scenario: Een token ophalen voor de app.