Dela via


En webbapp som anropar webb-API:er: Kodkonfiguration

Som visas i webbappen som loggar in användare använder webbappen OAuth 2.0-auktoriseringskodflödet för att logga in användaren. Det här flödet har två steg:

  1. Begär en auktoriseringskod. Den här delen delegerar en privat dialog med användaren till Microsofts identitetsplattform. Under den dialogen loggar användaren in och godkänner användningen av webb-API:er. När den privata dialogen avslutas får webbappen en auktoriseringskod på sin omdirigerings-URI.
  2. Begär en åtkomsttoken för API:et genom att lösa in auktoriseringskoden.

Webbappen som loggar in användarscenarier omfattade endast det första steget. Här lär du dig hur du ändrar din webbapp så att den inte bara loggar in användare utan även nu anropar webb-API:er.

Microsoft-bibliotek som stöder webbappar

Följande Microsoft-bibliotek stöder webbappar:

Språk/ramverk Projekt på
GitHub
Paket
komma igång
Logga in användare Åtkomst till webb-API:er Allmänt tillgänglig (GA) eller
Offentlig förhandsversion1
.NET MSAL.NET Microsoft.Identity.Client Biblioteket kan inte begära ID-token för användarinloggning. Biblioteket kan begära åtkomsttoken för skyddade webb-API:er. Allmän tillgänglighet
.NET Microsoft.IdentityModel Microsoft.IdentityModel Biblioteket kan inte begära ID-token för användarinloggning.2 Biblioteket kan inte begära åtkomsttoken för skyddade webb-API:er.2 Allmän tillgänglighet
ASP.NET Core ASP.NET Core Microsoft.AspNetCore.Authentication Snabbstart Biblioteket kan begära ID-token för användarinloggning. Biblioteket kan inte begära åtkomsttoken för skyddade webb-API:er. Allmän tillgänglighet
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web Snabbstart Biblioteket kan begära ID-token för användarinloggning. Biblioteket kan begära åtkomsttoken för skyddade webb-API:er. Allmän tillgänglighet
Java MSAL4J msal4j Snabbstart Biblioteket kan begära ID-token för användarinloggning. Biblioteket kan begära åtkomsttoken för skyddade webb-API:er. Allmän tillgänglighet
Spring spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory Självstudie Biblioteket kan begära ID-token för användarinloggning. Biblioteket kan begära åtkomsttoken för skyddade webb-API:er. Allmän tillgänglighet
Node.js MSAL-nod msal-node Snabbstart Biblioteket kan begära ID-token för användarinloggning. Biblioteket kan begära åtkomsttoken för skyddade webb-API:er. Allmän tillgänglighet
Python MSAL Python msal Biblioteket kan begära ID-token för användarinloggning. Biblioteket kan begära åtkomsttoken för skyddade webb-API:er. Allmän tillgänglighet
Python Identitet Identitet Snabbstart Biblioteket kan begära ID-token för användarinloggning. Biblioteket kan begära åtkomsttoken för skyddade webb-API:er. --

(1)Universella licensvillkor för onlinetjänster gäller för bibliotek i offentlig förhandsversion.

(2)Microsoft.IdentityModel-biblioteket validerar endast token – det kan inte begära ID eller åtkomsttoken.

Välj fliken för den plattform som du är intresserad av:

Klienthemligheter eller klientcertifikat

Eftersom webbappen nu anropar ett underordnat webb-API anger du en klienthemlighet eller ett klientcertifikat i appsettings.json-filen. Du kan också lägga till ett avsnitt som anger:

  • URL:en för det underordnade webb-API:et
  • De omfång som krävs för att anropa API:et

I följande exempel anger avsnittet GraphBeta dessa inställningar.

{
  "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"]
    }
}

Kommentar

Du kan föreslå en samling klientautentiseringsuppgifter, inklusive en lösning utan autentiseringsuppgifter som arbetsbelastningsidentitetsfederation för Azure Kubernetes. Tidigare versioner av Microsoft.Identity.Web uttryckte klienthemligheten i en enda egenskap "ClientSecret" i stället för "ClientCredentials". Detta stöds fortfarande för bakåtkompatibilitet, men du kan inte använda både egenskapen "ClientSecret" och samlingen "ClientCredentials".

I stället för en klienthemlighet kan du ange ett klientcertifikat. Följande kodfragment visar hur du använder ett certifikat som lagras i 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"]
  }
}

Varning

Om du glömmer att ändra Scopes till en matris visas null när du försöker använda omfången IDownstreamApi och IDownstreamApi ett anonymt (oautentiserat) anrop till det underordnade API:et, vilket resulterar i ett 401/unauthenticated.

Microsoft.Identity.Web innehåller flera sätt att beskriva certifikat, både efter konfiguration eller kod. Mer information finns i Microsoft.Identity.Web – Använda certifikat på GitHub.

Startup.cs

Webbappen måste hämta en token för det underordnade API:et. Du anger det genom att lägga till .EnableTokenAcquisitionToCallDownstreamApi() raden efter .AddMicrosoftIdentityWebApp(Configuration). Den här raden exponerar den IAuthorizationHeaderProvider tjänst som du kan använda i kontrollanten och sidåtgärder. Men som du ser i följande två alternativ kan det göras mer enkelt. Du måste också välja en implementering av tokencache, till exempel .AddInMemoryTokenCaches()i 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 omfång som skickas till EnableTokenAcquisitionToCallDownstreamApi är valfria och gör det möjligt för webbappen att begära omfången och användarens medgivande till dessa omfång när de loggar in. Om du inte anger omfången aktiverar Microsoft.Identity.Web en inkrementell medgivandeupplevelse.

Microsoft.Identity.Web erbjuder två mekanismer för att anropa ett webb-API från en webbapp utan att du behöver hämta en token. Vilket alternativ du väljer beror på om du vill anropa Microsoft Graph eller något annat API.

Alternativ 1: Anropa Microsoft Graph

Om du vill anropa Microsoft Graph gör Microsoft.Identity.Web att du kan använda GraphServiceClient (exponeras av Microsoft Graph SDK) direkt i dina API-åtgärder. Så här exponerar du Microsoft Graph:

  1. Lägg till NuGet-paketet Microsoft.Identity.Web.GraphServiceClient i projektet.

  2. Lägg till .AddMicrosoftGraph() efter .EnableTokenAcquisitionToCallDownstreamApi() i filen Startup.cs . .AddMicrosoftGraph() har flera åsidosättningar. Med hjälp av åsidosättningen som tar ett konfigurationsavsnitt som en parameter blir koden:

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

Alternativ 2: Anropa ett annat underordnat webb-API än Microsoft Graph

Om du vill anropa ett annat API än Microsoft Graph gör Microsoft.Identity.Web att du kan använda IDownstreamApi gränssnittet i dina API-åtgärder. Så här använder du det här gränssnittet:

  1. Lägg till NuGet-paketet Microsoft.Identity.Web.DownstreamApi i projektet.

  2. Lägg till .AddDownstreamApi() efter .EnableTokenAcquisitionToCallDownstreamApi() i filen Startup.cs . .AddDownstreamApi() har två argument och visas i följande kodfragment:

    • Namnet på en tjänst (API), som används i dina kontrollantåtgärder för att referera till motsvarande konfiguration
    • ett konfigurationsavsnitt som representerar de parametrar som används för att anropa det underordnade webb-API:et.
    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();
       // ...
      }
      // ...
    }
    

Sammanfattning

Precis som med webb-API:er kan du välja olika implementeringar av tokencache. Mer information finns i Microsoft.Identity.Web – Cache-serialisering för token på GitHub.

Följande bild visar de olika möjligheterna för Microsoft.Identity.Web och deras effekt på filen Startup.cs :

Blockdiagram som visar tjänstkonfigurationsalternativ i startpunkt C S för att anropa ett webb-API och ange en implementering av tokencache

Kommentar

Om du vill förstå kodexemplen fullt ut här bör du känna till grunderna för ASP.NET Core, särskilt beroendeinmatning och alternativ.

Kod som löser in auktoriseringskoden

Microsoft.Identity.Web förenklar koden genom att ange rätt OpenID-Anslut inställningar, prenumerera på den mottagna koden och lösa in koden. Ingen extra kod krävs för att lösa in auktoriseringskoden. Mer information om hur detta fungerar finns i Microsoft.Identity.Web-källkoden .

I stället för en klienthemlighet kan det konfidentiella klientprogrammet också bevisa sin identitet med hjälp av ett klientcertifikat eller ett klientintyg. Användningen av klientkontroller är ett avancerat scenario som beskrivs i Klientkontroller.

Tokencache

Viktigt!

Implementeringen av tokencache för webbappar eller webb-API:er skiljer sig från implementeringen för skrivbordsprogram, som ofta är filbaserad. Av säkerhets- och prestandaskäl är det viktigt att se till att det för webbappar och webb-API:er finns en tokencache per användarkonto. Du måste serialisera tokencachen för varje konto.

I självstudien ASP.NET core används beroendeinmatning för att du ska kunna bestämma implementeringen av tokencache i Startup.cs-filen för ditt program. Microsoft.Identity.Web levereras med fördefinierade token-cache-serialiserare som beskrivs i Token cache serialisering. En intressant möjlighet är att välja ASP.NET Core-distribuerade minnescacheminnen:

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

Mer information om token-cacheprovidrar finns även i artikeln microsoft.Identity.web's token cache serialization article, and the ASP.NET Core web app tutorials | Tokencachelagringsfasen i självstudiekursen för webbappar.

Nästa steg

Nu när användaren loggar in lagras en token i tokencachen. Nu ska vi se hur den sedan används i andra delar av webbappen.

Gå vidare till nästa artikel i det här scenariot: Ta bort konton från cachen vid global utloggning.