Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy: Dzierżawcy siły roboczej Biały okrąg z szarym symbolem X. dzierżawcy zewnętrzni (White circle with a gray X symbol.dowiedz się więcej)
W tym artykule opisano, jak skonfigurować kod dla aplikacji Web 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 web API: konfiguracja kodu | Microsoft.Identity.Web aby szybko zaprezentować tę bibliotekę w kontekście web 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ć zbiór poświadczeń klienta, w tym rozwiązanie bez użycia poświadczeń, takie jak federacja tożsamości obciążeń dla Azure Kubernetes. Poprzednie wersje Microsoft.Identity.Web zawierały tajny klucz 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
na tablicę, podczas próby użycia IDownstreamApi
okaże się, że będzie miało wartość null, i IDownstreamApi
podejmie próbę anonimowego (nieuwierzytelnionego) wywołania do podrzędnego interfejsu API, co spowoduje wystąpienie 401/unauthenticated
.
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ć Microsoft Graph, Microsoft.Identity.Web umożliwia bezpośrednie używanie GraphServiceClient
(udostępnione przez zestaw SDK Microsoft Graph) w działaniach 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ę ze zgłoszeniem 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ęć. Używając 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
oznacza nazwę podrzędnego interfejsu API, który Twój internetowy interfejs API chce wywołać. -
MyApiScope
to zakres niezbędny do poproszenia o dostęp do interfejsu API sieciowego, aby móc współdziałać z podrzędnym interfejsem API sieciowym
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 platformę tożsamości Microsoft i przepływ OAuth 2.0 On-Behalf-Of.