Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :
Locataires de main-d’œuvre (en savoir plus)
Cet article explique comment configurer du code pour une application API Web à l’aide du flux du code d’autorisation OAuth 2.0.
Microsoft vous recommande d’utiliser le package NuGet Microsoft.Identity.Web lors du développement d’une API protégée ASP.NET Core appelant des API web en aval. Voir API web protégée : Configuration du code | Microsoft.Identity.Web pour une présentation rapide de cette bibliothèque dans le contexte d’une API web.
Prerequisites
- Un compte Azure avec un abonnement actif.
Créez un compte gratuitement. Ce compte doit disposer des autorisations nécessaires pour gérer les applications. Utilisez l’un des rôles suivants nécessaires pour inscrire l’application :
- Administrateur d’application
- Développeur d’applications
- Inscrivez une nouvelle application dans le Centre d’administration Microsoft Entra, configurée pour les comptes dans cet annuaire organisationnel uniquement. Pour plus d’informations, reportez-vous à l'enregistrement d'une application. Enregistrez les valeurs suivantes à partir de la page Vue d’ensemble de l’application pour une utilisation ultérieure :
- ID d’application (client)
- ID de l’annuaire (locataire)
- Ajoutez un certificat client à l’inscription de l’application. Pour plus d’informations, consultez Ajouter et gérer les informations d’identification d’application dans l’ID Microsoft Entra.
Configurer l’application
Choisissez une langue pour votre API Web.
Secrets clients ou certificats clients
Dans la mesure où votre application web appelle désormais une API web en aval, fournissez un secret client ou un certificat client dans le fichier appsettings.json. Vous pouvez également ajouter une section spécifiant ce qui suit :
- URL de l’API web en aval ;
- étendues requises pour appeler l’API.
Dans l’exemple suivant, la section GraphBeta spécifie ces paramètres.
{
"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"]
}
}
Note
Vous pouvez proposer un ensemble d’informations d’identification client, y compris une solution sans informations d’identification telle que la fédération d’identités de charge de travail pour Azure Kubernetes. Les versions antérieures de Microsoft.Identity.Web exprimaient la clé secrète client dans une propriété unique « ClientSecret » au lieu de « ClientCredentials ». Cette fonctionnalité est toujours prise en charge à des fins de compatibilité ascendante, mais vous ne pouvez pas utiliser à la fois la propriété « ClientSecret » et la collection « ClientCredentials ».
À la place d’un secret client, vous pouvez fournir un certificat client. L’extrait de code suivant montre l’utilisation d’un certificat stocké dans 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"]
}
}
Warning
Si vous oubliez de remplacer Scopes par un tableau, lorsque vous essayez d’utiliser la IDownstreamApi, les champs d’application apparaîtront comme nuls et IDownstreamApi tentera un appel anonyme (non authentifié) vers l’API en aval, ce qui entraînera une erreur 401/unauthenticated.
Microsoft.Identity.Web offre plusieurs façons de décrire les certificats, que ce soit en définissant une configuration ou en écrivant du code. Pour plus d’informations, consultez Microsoft.Identity.Web - Using certificates sur GitHub.
Program.cs
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
// ...
L’API web doit acquérir un jeton pour l’API en aval. Spécifiez-le en ajoutant la ligne .EnableTokenAcquisitionToCallDownstreamApi() après .AddMicrosoftIdentityWebApi(Configuration). Cette ligne expose le service ITokenAcquisition que vous pouvez utiliser dans vos actions de contrôleur et de pages.
Toutefois, une autre méthode consiste à implémenter un cache de jetons. Par exemple, l’ajout de .AddInMemoryTokenCaches() à Program.cs permet au jeton d’être mis en cache en mémoire.
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
// ...
Microsoft.Identity.Web fournit deux mécanismes pour appeler une API web en aval à partir d’une autre API. L’option que vous choisissez varie selon que vous souhaitez appeler Microsoft Graph ou une autre API.
Option 1 : Appeler Microsoft Graph
Pour appeler Microsoft Graph, Microsoft.Identity.Web vous permet d’utiliser directement le GraphServiceClient (exposé par le Kit de développement logiciel (SDK) Microsoft Graph) dans vos actions d’API.
Note
Il existe un problème persistant pour Microsoft Graph SDK v5+. Pour en savoir plus, consultez la page Problème GitHub.
Pour exposer Microsoft Graph :
- Ajoutez le package NuGet Microsoft.Identity.Web.GraphServiceClient au projet.
- Ajoutez
.AddMicrosoftGraph()après.EnableTokenAcquisitionToCallDownstreamApi()dans Program.cs..AddMicrosoftGraph()a plusieurs remplacements. En utilisant le remplacement qui prend une section de configuration en tant que paramètre, le code devient :
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
.AddInMemoryTokenCaches();
// ...
Option n°2 : Appeler une API web en aval autre que Microsoft Graph
- Ajoutez le package NuGet Microsoft.Identity.Web.DownstreamApi au projet.
- Ajoutez
.AddDownstreamApi()après.EnableTokenAcquisitionToCallDownstreamApi()dans Program.cs. Le code devient :
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
.AddInMemoryTokenCaches();
// ...
où :
-
MyApidésigne le nom de l’API Web en aval que votre API Web a l’intention d’appeler ; -
MyApiScopecorrespond à la portée nécessaire à votre API Web pour interagir avec l’API Web en aval.
Ces valeurs seront représentées dans votre JSON, qui ressemblera à l’extrait suivant.
"DownstreamAPI": {
"BaseUrl": "https://downstreamapi.contoso.com/",
"Scopes": "user.read"
},
Si l’application web doit appeler une autre ressource d’API, répétez la méthode .AddDownstreamApi() avec l’étendue appropriée, comme indiqué dans l’extrait suivant :
using Microsoft.Identity.Web;
// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
.AddDownstreamApi("MyApi2", Configuration.GetSection("MyApi2Scope"))
.AddInMemoryTokenCaches();
// ...
Notez que .EnableTokenAcquisitionToCallDownstreamApi est appelé sans aucun paramètre, ce qui signifie que le jeton d’accès est acquis juste à temps lorsque le contrôleur demande le jeton en spécifiant l’étendue.
L’étendue peut également être passée lors de l’appel de .EnableTokenAcquisitionToCallDownstreamApi , ce qui permettra à l’application web d’acquérir le jeton lors de la connexion utilisateur initiale. Le jeton est ensuite extrait du cache lorsque le contrôleur le demande.
À l’instar des applications web, différentes implémentations de cache de jetons peuvent être choisies. Pour plus d’informations, consultez Microsoft identity web - Token cache serialization sur GitHub.
L’image suivante montre les possibilités pour Microsoft.Identity.Web et l’impact sur Program.cs :
Note
Pour bien comprendre les exemples de code présentés ici, vous devez maîtriser les notions de base d’ASP.NET Core, en particulier l’injection de dépendances et le modèle options.
Vous pouvez également voir un exemple d’implémentation de flux OBO dans Node.js et Azure Functions.
Protocole
Pour plus d’informations sur le protocole OBO, consultez la section Plateforme d’identités Microsoft et flux On-Behalf-Of OAuth 2.0.