Een web-app die web-API's aanroept: Codeconfiguratie

Zoals wordt weergegeven in het scenario Web-app die gebruikers aanmeldt, gebruikt de web-app de OAuth 2.0-autorisatiecodestroom om de gebruiker aan te melden. Deze stroom heeft twee stappen:

  1. Vraag een autorisatiecode aan. Dit deel delegeert een privédialoog met de gebruiker aan de Microsoft Identity Platform. Tijdens deze dialoog meldt de gebruiker zich aan en stemt deze in met het gebruik van web-API's. Wanneer de privédialoog is beëindigd, ontvangt de web-app een autorisatiecode op de omleidings-URI.
  2. Vraag een toegangstoken aan voor de API door de autorisatiecode in te wisselen.

De scenario's Web-app die gebruikers aanmeldt hebben alleen de eerste stap behandeld. Hier leert u hoe u uw web-app kunt wijzigen, zodat deze niet alleen gebruikers aanmeldt, maar ook nu web-API's aanroept.

Microsoft-bibliotheken die web-apps ondersteunen

De volgende Microsoft-bibliotheken ondersteunen web-apps:

Taal/framework Project over
GitHub
Pakket Aan de
slag
Gebruikers aanmelden Toegang krijgen tot web-API's Algemeen beschikbaar (GA) of
Openbare preview1
.NET MSAL.NET Microsoft.Identity.Client Bibliotheek kan geen id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. GA
.NET Microsoft.IdentityModel Microsoft.IdentityModel Bibliotheek kan geen id-tokens aanvragen voor aanmelding van gebruikers.2 Bibliotheek kan geen toegangstokens aanvragen voor beveiligde web-API's.2 GA
ASP.NET Core ASP.NET Core Microsoft.AspNetCore.Authentication Snelstartgids Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan geen toegangstokens aanvragen voor beveiligde web-API's. GA
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web Snelstartgids Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. GA
Java MSAL4J msal4j Snelstartgids Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. GA
Spring spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory Zelfstudie Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. GA
Node.js MSAL-knooppunt msal-node Snelstartgids Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. GA
Python MSAL Python msal Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. GA
Python identity identity Snelstartgids Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. --

(1)Universele licentievoorwaarden voor onlineservices zijn van toepassing op bibliotheken in openbare preview.

(2) De bibliotheek Microsoft.IdentityModel valideert alleen tokens. Er kunnen geen id- of toegangstokens worden aangevraagd.

Selecteer het tabblad voor het platform waarin u geïnteresseerd bent:

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.

Startup.cs

Uw web-app moet een token verkrijgen voor de downstream-API. U geeft deze op door de regel .EnableTokenAcquisitionToCallDownstreamApi() na .AddMicrosoftIdentityWebApp(Configuration) toe te voegen. Deze regel bevat de service IAuthorizationHeaderProvider die u kunt gebruiken in uw controller- en paginaacties. Zoals u echter in de volgende twee opties ziet, kunt u dit eenvoudiger doen. U moet ook een tokencache-implementatie kiezen, bijvoorbeeld .AddInMemoryTokenCaches()in Startup.cs:

using Microsoft.Identity.Web;

public class Startup
{
  // ...
  public void ConfigureServices(IServiceCollection services)
  {
  // ...
  services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
          .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
            .AddInMemoryTokenCaches();
   // ...
  }
  // ...
}

De bereiken die aan EnableTokenAcquisitionToCallDownstreamApi zijn doorgegeven, zijn optioneel en stellen uw web-app in staat om de bereiken aan te vragen en de toestemming van de gebruiker voor deze bereiken wanneer ze zich aanmelden. Als u de bereiken niet opgeeft, schakelt Microsoft.Identity.Web een incrementele toestemmingservaring in.

Microsoft.Identity.Web biedt twee mechanismen voor het aanroepen van een web-API vanuit een web-app zonder dat u een token hoeft te verkrijgen. 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 gebruiken (beschikbaar gesteld door de Microsoft Graph SDK) in uw API-acties. Microsoft Graph beschikbaar maken:

  1. Voeg het NuGet-pakket Microsoft.Identity.Web.GraphServiceClient toe aan uw project.

  2. Voeg .AddMicrosoftGraph() na .EnableTokenAcquisitionToCallDownstreamApi() toe aan het bestand Startup.cs. .AddMicrosoftGraph() heeft verschillende onderdrukkingen. Als u de onderdrukking gebruikt die een configuratiesectie als parameter gebruikt, wordt de code:

    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

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

Als u een andere API wilt aanroepen dan Microsoft Graph, kunt u met Microsoft.Identity.Web de IDownstreamApi interface in uw API-acties gebruiken. Ga als volgt te werk om deze interface te gebruiken:

  1. Voeg het NuGet-pakket Microsoft.Identity.Web.DownstreamApi toe aan uw project.

  2. Voeg .AddDownstreamApi() na .EnableTokenAcquisitionToCallDownstreamApi() toe aan het bestand Startup.cs. .AddDownstreamApi() heeft twee argumenten en wordt weergegeven in het volgende fragment:

    • De naam van een service (API), die wordt gebruikt in de controlleracties om te verwijzen naar de bijbehorende configuratie
    • een configuratiesectie die de parameters vertegenwoordigt die worden gebruikt om de downstream-web-API aan te roepen.
    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddDownstreamApi("MyApi", Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

Samenvatting

Net als bij web-API's kunt u verschillende tokencacheimplementaties kiezen. Zie Microsoft.Identity.Web - Serialisatie van tokencache op GitHub voor meer informatie.

In de volgende afbeelding ziet u de verschillende mogelijkheden van Microsoft.Identity.Web en het effect ervan op het bestand Startup.cs :

Blokdiagram met de opties voor serviceconfiguratie in Startup.cs voor het oproepen van een web-API en het specificeren van een tokencache-implementatie

Notitie

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

Code waarmee de autorisatiecode wordt ingewisseld

Microsoft.Identity.Web vereenvoudigt uw code door de juiste OpenID Connect-instellingen in te stellen, u te abonneren op de ontvangen codegebeurtenis en de code in te wisselen. Er is geen extra code vereist om de autorisatiecode in te wisselen. Zie de broncode van Microsoft.Identity.Web voor meer informatie over hoe dit werkt.

In plaats van een clientgeheim kan de vertrouwelijke clienttoepassing ook de identiteit bewijzen met behulp van een clientcertificaat of een clientverklaring. Het gebruik van clientverklaringen is een geavanceerd scenario, dat wordt beschreven in clientverklaringen.

Tokencache

Belangrijk

De implementatie van tokencache voor web-apps of web-API's verschilt van de implementatie voor bureaubladtoepassingen, die vaak op bestanden zijn gebaseerd. Om veiligheids- en prestatieredenen is het belangrijk om ervoor te zorgen dat er voor web-apps en web-API's één tokencache per gebruikersaccount is. U moet de tokencache voor elk account serialiseren.

De ASP.NET kernzelfstudie maakt gebruik van afhankelijkheidsinjectie om u te laten beslissen over de implementatie van de tokencache in het bestand Startup.cs voor uw toepassing. Microsoft.Identity.Web wordt geleverd met vooraf gedefinieerde serialisatieprogramma's voor tokencache die worden beschreven in serialisatie van tokencaches. Een interessante mogelijkheid is om ASP.NET Core gedistribueerde geheugencaches te kiezen:

// Use a distributed token cache by adding:
    services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(
                initialScopes: new string[] { "user.read" })
            .AddDistributedTokenCaches();

// Then, choose your implementation.
// For instance, the distributed in-memory cache (not cleared when you stop the app):
services.AddDistributedMemoryCache();

// Or a Redis cache:
services.AddStackExchangeRedisCache(options =>
{
 options.Configuration = "localhost";
 options.InstanceName = "SampleInstance";
});

// Or even a SQL Server token cache:
services.AddDistributedSqlServerCache(options =>
{
 options.ConnectionString = _config["DistCache_ConnectionString"];
 options.SchemaName = "dbo";
 options.TableName = "TestCache";
});

Zie voor meer informatie over de token-cacheproviders ook het artikel over serialisatie van tokencaches van Microsoft.Identity.Web en de zelfstudies voor ASP.NET Core-web-app | Tokencachefase van de zelfstudie voor web-apps.

Volgende stappen

Wanneer de gebruiker zich aanmeldt, wordt er op dit moment een token opgeslagen in de tokencache. Laten we eens kijken hoe deze vervolgens wordt gebruikt in andere onderdelen van de web-app.

Ga verder met het volgende artikel in dit scenario. Verwijder accounts uit de cache bij afmelden voor globale aanmelding.