Partager via


Une API web qui appelle des API web : Configuration de code

S’applique à : cercle vert avec un symbole de coche blanc qui indique que le contenu suivant s’applique aux locataires du personnel. 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

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 :

  1. Ajoutez le package NuGet Microsoft.Identity.Web.GraphServiceClient au projet.
  2. 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

  1. Ajoutez le package NuGet Microsoft.Identity.Web.DownstreamApi au projet.
  2. 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ù :

  • MyApi désigne le nom de l’API Web en aval que votre API Web a l’intention d’appeler ;
  • MyApiScope correspond à 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 :

Diagramme de bloc montrant des options de configuration de service dans le point de départ CS pour appeler une API web et spécifier une implémentation de cache de jeton

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.

Étape suivante