Udostępnij za pośrednictwem


Aplikacja internetowa, która wywołuje internetowe interfejsy API: konfiguracja kodu

W poprzednim artykule zarejestrowano aplikację w firmie Microsoft Entra. W tym artykule pokazano, jak skonfigurować kod aplikacji i zmodyfikować aplikację internetową, aby nie tylko logować użytkowników, ale także teraz wywołuje internetowe interfejsy API. Utworzona aplikacja używa przepływu kodu autoryzacji OAuth 2.0 w celu zalogowania użytkownika. Ten przepływ ma dwa kroki:

  1. Poproś o kod autoryzacyjny. Ta część deleguje prywatny dialog z użytkownikiem do Platforma tożsamości Microsoft. Podczas tego okna dialogowego użytkownik loguje się i wyraża zgodę na korzystanie z internetowych interfejsów API. Po pomyślnym zakończeniu prywatnego okna dialogowego aplikacja internetowa otrzyma kod autoryzacji w identyfikatorze URI przekierowania.
  2. Zażądaj tokenu dostępu dla interfejsu API, zrealizowając kod autoryzacji.

Wymagania wstępne

Biblioteki firmy Microsoft obsługujące aplikacje internetowe

Następujące biblioteki firmy Microsoft obsługują aplikacje internetowe:

Język/struktura Projekt w dniu
GitHub
Pakiet Coraz
pracę
Logowanie użytkowników Dostęp do interfejsów API sieci Web Ogólnie dostępne (ogólna dostępność) lub
Publiczna wersja zapoznawcza1
.NET MSAL.NET Microsoft.Identity.Client Biblioteka nie może zażądać tokenów identyfikatorów logowania użytkownika. Biblioteka może żądać tokenów dostępu dla chronionych internetowych interfejsów API. Ogólna dostępność
.NET Microsoft.IdentityModel Microsoft.IdentityModel Biblioteka nie może zażądać tokenów identyfikatorów logowania użytkownika.2 Biblioteka nie może żądać tokenów dostępu dla chronionych internetowych interfejsów API.2 Ogólna dostępność
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web Szybki start Biblioteka może żądać tokenów identyfikatorów logowania użytkownika. Biblioteka może żądać tokenów dostępu dla chronionych internetowych interfejsów API. Ogólna dostępność
Java MSAL4J msal4j Szybki start Biblioteka może żądać tokenów identyfikatorów logowania użytkownika. Biblioteka może żądać tokenów dostępu dla chronionych internetowych interfejsów API. Ogólna dostępność
Spring spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory Samouczek Biblioteka może żądać tokenów identyfikatorów logowania użytkownika. Biblioteka może żądać tokenów dostępu dla chronionych internetowych interfejsów API. Ogólna dostępność
Node.js Węzeł BIBLIOTEKI MSAL msal-node Szybki start Biblioteka może żądać tokenów identyfikatorów logowania użytkownika. Biblioteka może żądać tokenów dostępu dla chronionych internetowych interfejsów API. Ogólna dostępność
Python MSAL Python msal Biblioteka może żądać tokenów identyfikatorów logowania użytkownika. Biblioteka może żądać tokenów dostępu dla chronionych internetowych interfejsów API. Ogólna dostępność
Python tożsamość tożsamość Szybki start Biblioteka może żądać tokenów identyfikatorów logowania użytkownika. Biblioteka może żądać tokenów dostępu dla chronionych internetowych interfejsów API. --

(1) Uniwersalne postanowienia licencyjne dotyczące usług online mają zastosowanie do bibliotek w publicznej wersji zapoznawczej.

(2) Biblioteka Microsoft.IdentityModel weryfikuje tylko tokeny — nie może żądać identyfikatora ani tokenów dostępu.

Wybierz kartę dla wybranej platformy:

Wpisy tajne klienta lub certyfikaty klienta

Biorąc pod uwagę, że aplikacja internetowa wywołuje teraz podrzędny internetowy interfejs API, podaj klucz tajny klienta lub certyfikat klienta w pliku appsettings.json . Możesz również dodać sekcję, która określa:

  • Adres URL podrzędnego internetowego interfejsu API
  • Zakresy wymagane do wywoływania interfejsu API

W poniższym przykładzie GraphBeta sekcja określa te ustawienia.

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

Uwaga

Możesz zaproponować kolekcję poświadczeń klienta, w tym rozwiązanie bez poświadczeń, takie jak federacja tożsamości obciążenia dla usługi Azure Kubernetes. Poprzednie wersje pliku Microsoft.Identity.Web wyraziły wpis tajny klienta w pojedynczej właściwości "ClientSecret" zamiast "ClientCredentials". Jest to nadal obsługiwane w przypadku zgodności z poprzednimi wersjami, ale nie można użyć zarówno właściwości "ClientSecret", jak i kolekcji "ClientCredentials".

Zamiast klucza tajnego klienta można podać certyfikat klienta. Poniższy fragment kodu przedstawia użycie certyfikatu przechowywanego w usłudze 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"]
  }
}

Ostrzeżenie

Jeśli zapomnisz zmienić Scopes obiekt na tablicę, próba użycia IDownstreamApi zakresów będzie mieć wartość null i IDownstreamApi podejmie próbę wywołania anonimowego (nieuwierzytelnionego) do podrzędnego interfejsu API, co spowoduje 401/unauthenticatedwystąpienie .

Microsoft.Identity.Web udostępnia kilka sposobów opisywania certyfikatów, zarówno przez konfigurację, jak i kod. Aby uzyskać szczegółowe informacje, zobacz Microsoft.Identity.Web — używanie certyfikatów w witrynie GitHub.

Modyfikowanie pliku Startup.cs

Aplikacja internetowa musi uzyskać token dla podrzędnego interfejsu API. Należy go określić, dodając .EnableTokenAcquisitionToCallDownstreamApi() wiersz po .AddMicrosoftIdentityWebApp(Configuration). Ten wiersz uwidacznia usługę IAuthorizationHeaderProvider , której można używać w ramach akcji kontrolera i strony. Jednak jak widać w poniższych dwóch opcjach, można to zrobić bardziej po prostu. Należy również wybrać implementację pamięci podręcznej tokenów, na przykład .AddInMemoryTokenCaches()w 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();
   // ...
  }
  // ...
}

Zakresy przekazywane do EnableTokenAcquisitionToCallDownstreamApi są opcjonalne i umożliwiają aplikacji internetowej żądanie zakresów i zgody użytkownika na te zakresy podczas logowania. Jeśli nie określisz zakresów, platforma Microsoft.Identity.Web włączy środowisko zgody przyrostowej.

Microsoft.Identity.Web oferuje dwa mechanizmy wywoływania internetowego interfejsu API z aplikacji internetowej bez konieczności uzyskiwania tokenu. Wybrana opcja zależy od tego, czy chcesz wywołać program Microsoft Graph, czy inny interfejs API.

Opcja 1. Wywoływanie programu Microsoft Graph

Jeśli chcesz wywołać program Microsoft Graph, microsoft.Identity.Web umożliwia bezpośrednie używanie GraphServiceClient (uwidocznionych przez zestaw SDK programu Microsoft Graph) w akcjach interfejsu API. Aby uwidocznić program Microsoft Graph:

  1. Dodaj pakiet NuGet Microsoft.Identity.Web.GraphServiceClient do projektu.

  2. Dodaj .AddMicrosoftGraph() po .EnableTokenAcquisitionToCallDownstreamApi() w pliku Startup.cs . .AddMicrosoftGraph() ma kilka przesłonięć. Za pomocą przesłonięcia, które przyjmuje sekcję konfiguracji jako parametr, kod staje się następujący:

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

Opcja 2. Wywoływanie podrzędnego internetowego interfejsu API innego niż Microsoft Graph

Jeśli chcesz wywołać interfejs API inny niż Microsoft Graph, microsoft.Identity.Web umożliwia korzystanie z interfejsu w akcjach interfejsu IDownstreamApi API. Aby użyć tego interfejsu:

  1. Dodaj pakiet NuGet Microsoft.Identity.Web.DownstreamApi do projektu.

  2. Dodaj .AddDownstreamApi() po .EnableTokenAcquisitionToCallDownstreamApi() w pliku Startup.cs . .AddDownstreamApi() ma dwa argumenty i jest wyświetlany w następującym fragmencie kodu:

    • Nazwa usługi (API), która jest używana w akcjach kontrolera do odwoływania się do odpowiedniej konfiguracji
    • sekcja konfiguracji reprezentująca parametry używane do wywoływania podrzędnego internetowego interfejsu API.
    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();
       // ...
      }
      // ...
    }
    

Podsumowanie

Podobnie jak w przypadku internetowych interfejsów API, można wybrać różne implementacje pamięci podręcznej tokenów. Aby uzyskać szczegółowe informacje, zobacz Microsoft.Identity.Web — serializacja pamięci podręcznej tokenów w witrynie GitHub.

Na poniższej ilustracji przedstawiono różne możliwości microsoft.Identity.Web oraz ich wpływ na plik Startup.cs:

Diagram blokowy przedstawiający opcje konfiguracji usługi w programie startup dot C S na potrzeby wywoływania internetowego interfejsu API i określania implementacji pamięci podręcznej tokenu

Uwaga

Aby w pełni zrozumieć przykłady kodu, zapoznaj się z podstawami ASP.NET Core, a w szczególności z iniekcją zależności i opcjami.

Kod, który zrealizował kod autoryzacji

Microsoft.Identity.Web upraszcza kod przez ustawienie poprawnych ustawień programu OpenID Connect, subskrybowanie odebranych zdarzeń kodu i realizowanie kodu. Do realizacji kodu autoryzacji nie jest wymagany dodatkowy kod. Zobacz Kod źródłowy Microsoft.Identity.Web, aby uzyskać szczegółowe informacje na temat tego, jak to działa.

Zamiast wpisu tajnego klienta poufnej aplikacji klienckiej można również udowodnić swoją tożsamość przy użyciu certyfikatu klienta lub potwierdzenia klienta. Użycie asercji klienta jest zaawansowanym scenariuszem, szczegółowo opisanym w artykule Asercji klientów.

Pamięć podręczna tokenów

Ważne

Implementacja pamięci podręcznej tokenu dla aplikacji internetowych lub internetowych interfejsów API różni się od implementacji aplikacji klasycznych, która jest często oparta na plikach. Ze względów bezpieczeństwa i wydajności należy upewnić się, że w przypadku aplikacji internetowych i internetowych interfejsów API istnieje jedna pamięć podręczna tokenów na konto użytkownika. Należy serializować pamięć podręczną tokenów dla każdego konta.

Samouczek ASP.NET core używa iniekcji zależności, aby umożliwić podjęcie decyzji o implementacji pamięci podręcznej tokenu w pliku Startup.cs dla aplikacji. Microsoft.Identity.Web zawiera wstępnie utworzone serializatory pamięci podręcznej tokenów opisane w artykule Serializacja pamięci podręcznej tokenów. Interesującą możliwością jest wybranie pamięci rozproszonych ASP.NET Core:

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

Aby uzyskać szczegółowe informacje na temat dostawców token-pamięci podręcznej, zobacz artykuł Dotyczący serializacji pamięci podręcznej tokenów Microsoft.Identity.Web oraz samouczki dotyczące aplikacji internetowej platformy ASP.NET Core | Etap buforowania tokenów w samouczku dotyczącym aplikacji internetowych.

Następny krok

W tym momencie po zalogowaniu użytkownika token jest przechowywany w pamięci podręcznej tokenu. Zobaczmy, jak jest ona następnie używana w innych częściach aplikacji internetowej.