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/unauthenticated
wystą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:
- Dodaj pakiet NuGet Microsoft.Identity.Web.GraphServiceClient do projektu.
- 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
- Dodaj pakiet NuGet Microsoft.Identity.Web.DownstreamApi do projektu.
- 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 APIMyApiScope
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:
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.