Een web-API die web-API's aanroept: codeconfiguratie
In dit artikel wordt beschreven hoe u code configureert voor een web-API-app met behulp van de OAuth 2.0-autorisatiecodestroom.
Microsoft raadt u aan het NuGet-pakket Microsoft.Identity.Web te gebruiken bij het ontwikkelen van een met ASP.NET Core beveiligde API die downstream-web-API's aanroept. Zie Beveiligde web-API: codeconfiguratie | Microsoft.Identity.Web voor een snelle presentatie van die bibliotheek in de context van een web-API.
Vereisten
De app configureren
Kies een taal voor uw web-API.
Clientgeheimen of clientcertificaten
Aangezien uw web-app nu een downstream-web-API aanroept, geeft u een clientgeheim of clientcertificaat op in het bestand appsettings.json. U kunt ook een sectie toevoegen die het volgende aangeeft:
- De URL van de downstream web-API
- De bereiken die nodig zijn voor het aanroepen van de API
In het volgende voorbeeld geeft de GraphBeta
sectie deze instellingen op.
{
"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"]
}
}
Notitie
U kunt een verzameling clientreferenties voorstellen, waaronder een oplossing zonder referenties, zoals federatie van workloadidentiteit voor Azure Kubernetes. Vorige versies van Microsoft.Identity.Web hebben het clientgeheim uitgedrukt in één eigenschap ClientSecret in plaats van ClientCredentials. Dit wordt nog steeds ondersteund voor compatibiliteit met eerdere versies, maar u kunt niet zowel de eigenschap ClientSecret als de verzameling ClientCredentials gebruiken.
In plaats van een clientgeheim kunt u een clientcertificaat opgeven. Het volgende codefragment toont het gebruik van een certificaat dat is opgeslagen in 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"]
}
}
Waarschuwing
Als u vergeet de Scopes
in een matrix te wijzigen, wordt wanneer u de IDownstreamApi
bereiken probeert te gebruiken null weergegeven en IDownstreamApi
wordt geprobeerd een anonieme (niet-geverifieerde) aanroep naar de downstream-API uit te voeren, wat resulteert in een 401/unauthenticated
.
Microsoft.Identity.Web biedt verschillende manieren om certificaten te beschrijven, zowel op configuratie als op code. Zie Microsoft.Identity.Web - Certificaten gebruiken op GitHub voor meer informatie.
Program.cs
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
// ...
Een web-API moet een token verkrijgen voor de downstream-API. Geef deze op door de .EnableTokenAcquisitionToCallDownstreamApi()
regel erna .AddMicrosoftIdentityWebApi(Configuration)
toe te voegen. Deze regel bevat de ITokenAcquisition
service die kan worden gebruikt in de acties controller/pagina's.
Een alternatieve methode is echter het implementeren van een tokencache. Als u bijvoorbeeld aan Program.cs kunt toevoegen.AddInMemoryTokenCaches()
, kan het token in de cache worden opgeslagen in het geheugen.
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
// ...
Microsoft.Identity.Web biedt twee mechanismen voor het aanroepen van een downstream-web-API vanuit een andere API. De optie die u kiest, is afhankelijk van of u Microsoft Graph of een andere API wilt aanroepen.
Optie 1: Microsoft Graph aanroepen
Als u Microsoft Graph wilt aanroepen, kunt u met Microsoft.Identity.Web de GraphServiceClient
API-acties rechtstreeks gebruiken (beschikbaar gesteld door de Microsoft Graph SDK).
Notitie
Er is een doorlopend probleem met Microsoft Graph SDK v5+. Raadpleeg het GitHub-probleem voor meer informatie.
Microsoft Graph beschikbaar maken:
- Voeg het NuGet-pakket Microsoft.Identity.Web.GraphServiceClient toe aan het project.
- Voeg
.AddMicrosoftGraph()
na.EnableTokenAcquisitionToCallDownstreamApi()
in Program.cs toe..AddMicrosoftGraph()
heeft verschillende onderdrukkingen. Als u de onderdrukking gebruikt die een configuratiesectie als parameter gebruikt, wordt de code:
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
.AddInMemoryTokenCaches();
// ...
Optie 2: een andere downstream web-API aanroepen dan Microsoft Graph
- Voeg het NuGet-pakket Microsoft.Identity.Web.DownstreamApi toe aan het project.
- Voeg
.AddDownstreamApi()
na.EnableTokenAcquisitionToCallDownstreamApi()
in Program.cs toe. De code wordt:
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
.AddInMemoryTokenCaches();
// ...
waar;
MyApi
geeft de naam aan van de downstream-web-API die uw web-API wil aanroepenMyApiScope
is het bereik dat nodig is om uw web-API aan te vragen om te communiceren met de downstream-web-API
Deze waarden worden weergegeven in uw JSON die vergelijkbaar is met het volgende codefragment.
"DownstreamAPI": {
"BaseUrl": "https://downstreamapi.contoso.com/",
"Scopes": "user.read"
},
Als de web-app een andere API-resource moet aanroepen, herhaalt u de .AddDownstreamApi()
methode met het relevante bereik, zoals wordt weergegeven in het volgende fragment:
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
.AddDownstreamApi("MyApi2", Configuration.GetSection("MyApi2Scope"))
.AddInMemoryTokenCaches();
// ...
Houd er rekening mee dat zonder .EnableTokenAcquisitionToCallDownstreamApi
parameter wordt aangeroepen, wat betekent dat het toegangstoken net op tijd wordt verkregen wanneer de controller het token aanvraagt door het bereik op te geven.
Het bereik kan ook worden doorgegeven tijdens het aanroepen .EnableTokenAcquisitionToCallDownstreamApi
, waardoor de web-app het token verkrijgt tijdens de initiële aanmelding van de gebruiker zelf. Het token wordt vervolgens opgehaald uit de cache wanneer de controller dit aanvraagt.
Net als bij web-apps kunnen verschillende tokencache-implementaties worden gekozen. Zie Microsoft.Identity.Web - Serialisatie van tokencache op GitHub voor meer informatie.
In de volgende afbeelding ziet u de mogelijkheden van Microsoft.Identity.Web en de impact op Program.cs:
Notitie
Om de codevoorbeelden hier volledig te begrijpen, moet u vertrouwd zijn met ASP.NET Core basisprincipes en met name met afhankelijkheidsinjectie en opties.
U kunt ook een voorbeeld zien van de implementatie van een OBO-stroom in Node.js en Azure Functions.
Protocol
Zie het Microsoft-identiteitsplatform en de Namens-stroom voor OAuth 2.0 voor meer informatie over het OBO-protocol.
Volgende stap
Een token voor de app verkrijgen.