Share via


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

Van toepassing op: Groene cirkel met een wit vinkje dat aangeeft dat de volgende inhoud van toepassing is op werknemerstenants. Werknemerstenants (meer informatie)

In dit artikel wordt uitgelegd hoe u de toepassingscode configureert en uw web-app wijzigt, zodat deze niet alleen gebruikers aanmeldt, maar ook web-API's aanroept. De toepassing die u maakt, maakt gebruik van 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.

Vereisten

  • Een Azure-account met een actief abonnement. Gratis een account maken Dit account moet machtigingen hebben voor het beheren van toepassingen. Gebruik een van de volgende rollen die nodig zijn om de toepassing te registreren:
    • Applicatiebeheerder
    • Toepassingsontwikkelaar
  • Registreer een nieuwe app in het Microsoft Entra-beheercentrum, alleen geconfigureerd voor accounts in deze organisatiemap. Raadpleeg Een applicatie registreren voor meer details. Noteer de volgende waarden van de Overview pagina van de applicatie voor later gebruik.
    • Applicatie (client) ID
    • ID van de directory (tenant)

Microsoft-bibliotheken die web-apps ondersteunen

De volgende Microsoft-bibliotheken ondersteunen web-apps:

Taal / framework Project aan
GitHub
Pakket Krijgen
begonnen
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. Algemene Vergadering
.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 Algemene Vergadering
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web Snelstart Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. Algemene Vergadering
Java MSAL4J msal4j Snelstart Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. Algemene Vergadering
Lente spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory Handleiding Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. Algemene Vergadering
Node.js MSAL-knooppunt msal-node Snelstart Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. Algemene Vergadering
Python MSAL Python msal Bibliotheek kan id-tokens aanvragen voor aanmelding van gebruikers. Bibliotheek kan toegangstokens aanvragen voor beveiligde web-API's. Algemene Vergadering
Python identiteit identiteit Snelstart 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 toestemmingsniveaus 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 verificatiegegevens, zoals de federatie van workloadidentiteiten 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, zullen de scopes worden weergegeven als null wanneer u probeert de IDownstreamApi te gebruiken, en IDownstreamApi zal proberen een anonieme (niet-geverifieerde) oproep te doen naar de interne API, 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.

Het Startup.cs-bestand wijzigen

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 toestemmingen die aan EnableTokenAcquisitionToCallDownstreamApi worden doorgegeven, zijn optioneel en stellen uw webapplicatie in staat om deze toestemmingen aan te vragen en de toestemming van de gebruiker voor deze toestemmingen te verkrijgen wanneer zij 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 direct de GraphServiceClient gebruiken (geëxposeerd 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 overschrijvingen. Als u een overschrijving gebruikt met een configuratiesectie als parameter, 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.

Token-cache

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 stap

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.