Udostępnij za pośrednictwem


Internetowy interfejs API, który wywołuje internetowe interfejsy API: konfiguracja kodu

W tym artykule opisano sposób konfigurowania kodu dla aplikacji internetowego interfejsu API przy użyciu przepływu kodu autoryzacji OAuth 2.0.

Firma Microsoft zaleca użycie pakietu NuGet Microsoft.Identity.Web podczas tworzenia chronionego interfejsu API ASP.NET Core wywołującego podrzędne internetowe interfejsy API. Zobacz Chroniony internetowy interfejs API: konfiguracja kodu | Microsoft.Identity.Web umożliwia szybką prezentację tej biblioteki w kontekście internetowego interfejsu API.

Wymagania wstępne

Konfigurowanie aplikacji

Wybierz język internetowego interfejsu API.

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.

Program.cs

using Microsoft.Identity.Web;

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

Internetowy interfejs API musi uzyskać token dla podrzędnego interfejsu API. Określ go, dodając .EnableTokenAcquisitionToCallDownstreamApi() wiersz po .AddMicrosoftIdentityWebApi(Configuration). Ten wiersz uwidacznia usługę ITokenAcquisition , która może być używana w akcjach kontrolera/stron.

Alternatywną metodą jest jednak zaimplementowanie pamięci podręcznej tokenów. Na przykład dodanie .AddInMemoryTokenCaches()elementu do Program.cs umożliwia buforowanie tokenu w pamięci.

using Microsoft.Identity.Web;

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

Microsoft.Identity.Web udostępnia dwa mechanizmy wywoływania podrzędnego internetowego interfejsu API z innego interfejsu API. Wybrana opcja zależy od tego, czy chcesz wywołać program Microsoft Graph, czy inny interfejs API.

Opcja 1. Wywoływanie programu Microsoft Graph

Aby 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.

Uwaga

Istnieje ciągły problem dotyczący zestawu Microsoft Graph SDK w wersji 5 lub nowszej. Aby uzyskać więcej informacji, zapoznaj się z problemem z usługą GitHub.

Aby uwidocznić program Microsoft Graph:

  1. Dodaj pakiet NuGet Microsoft.Identity.Web.GraphServiceClient do projektu.
  2. Dodaj .AddMicrosoftGraph() po .EnableTokenAcquisitionToCallDownstreamApi() w Program.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;

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

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

  1. Dodaj pakiet NuGet Microsoft.Identity.Web.DownstreamApi do projektu.
  2. Dodaj .AddDownstreamApi() po .EnableTokenAcquisitionToCallDownstreamApi() w Program.cs. Kod staje się:
using Microsoft.Identity.Web;

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

gdzie;

  • MyApi określa nazwę podrzędnego internetowego interfejsu API, który ma być wywoływany przez internetowy interfejs API
  • MyApiScope to zakres niezbędny do zażądania internetowego interfejsu API w celu interakcji z podrzędnym internetowym interfejsem API

Te wartości będą reprezentowane w kodzie JSON, który będzie podobny do poniższego fragmentu kodu.

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

Jeśli aplikacja internetowa musi wywołać inny zasób interfejsu API, powtórz metodę .AddDownstreamApi() z odpowiednim zakresem, jak pokazano w poniższym fragmencie kodu:

using Microsoft.Identity.Web;

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

Należy pamiętać, że .EnableTokenAcquisitionToCallDownstreamApi jest wywoływany bez żadnego parametru, co oznacza, że token dostępu jest uzyskiwany w odpowiednim czasie, ponieważ kontroler żąda tokenu, określając zakres.

Zakres można również przekazać podczas wywoływania metody .EnableTokenAcquisitionToCallDownstreamApi, co spowoduje, że aplikacja internetowa uzyska token podczas początkowego logowania użytkownika. Token zostanie następnie ściągnięty z pamięci podręcznej, gdy kontroler zażąda go.

Podobnie jak w przypadku aplikacji internetowych, można wybrać różne implementacje pamięci podręcznej tokenów. Aby uzyskać szczegółowe informacje, zobacz Microsoft identity web — token cache serialization on GitHub (Sieć Web tożsamości firmy Microsoft — serializacja pamięci podręcznej tokenów w witrynie GitHub).

Na poniższej ilustracji przedstawiono możliwości microsoft.Identity.Web oraz wpływ na Program.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.

Możesz również zapoznać się z przykładem implementacji przepływu OBO w usługach Node.js i Azure Functions.

Protokół

Aby uzyskać więcej informacji na temat protokołu OBO, zobacz przepływ Platforma tożsamości Microsoft i OAuth 2.0 On-Behalf-Of.

Następny krok