Acquérir des jetons pour appeler une API web à l’aide d’une application démon

Une fois l’application cliente confidentielle construite, vous pouvez acquérir un jeton pour celle-ci en appelant AcquireTokenForClient, en transmettant l’étendue, voire en forçant une actualisation du jeton.

Étendues à demander

L'étendue à demander pour un flux d'informations d'identification client est le nom de la ressource suivi de /.default. Cette notation indique à Microsoft Entra ID d’utiliser les autorisations de niveau application déclarées de manière statique pendant l’inscription d’application. En outre, ces autorisations d’API doivent être accordées par un administrateur client.

Voici un exemple de définition des étendues de l’API web dans le cadre de la configuration dans un fichier appsettings.json. Cet exemple est extrait de l’exemple de code démon de console .NET sur GitHub.

{
    "AzureAd": {
        // Same AzureAd section as before.
    },

    "MyWebApi": {
        "BaseUrl": "https://localhost:44372/",
        "RelativePath": "api/TodoList",
        "RequestAppToken": true,
        "Scopes": [ "[Enter here the scopes for your web API]" ]
    }
}

Ressources Azure AD (v1.0)

L’étendue utilisée pour les informations d’identification client doit toujours être l’ID de ressource suivi de /.default.

Important

Quand la bibliothèque MSAL demande un jeton d’accès pour une ressource acceptant un jeton d’accès version 1.0, Microsoft Entra ID analyse l’audience souhaitée d’après l’étendue demandée, en prenant tout ce qui précède la dernière barre oblique et en l’utilisant comme identificateur de la ressource. Par conséquent, si, comme Azure SQL Database (https://database.windows.net), la ressource attend une audience se terminant par une barre oblique (pour Azure SQL Database, https://database.windows.net/), vous devez demander une étendue de https://database.windows.net//.default. (Notez la double barre oblique.) Voir aussi le problème MSAL.NET no 747 : Resource url's trailing slash is omitted, which caused sql auth failure.

API AcquireTokenForClient

Pour acquérir un jeton pour l’application, utilisez AcquireTokenForClient ou son équivalent, en fonction de la plateforme.

Avec Microsoft.Identity.Web, vous n’avez pas besoin d’acquérir un jeton. Vous pouvez utiliser des API de niveau supérieur, comme vous le voyez dans Appel d’une API web à partir d’une application démon. Toutefois, si vous utilisez un Kit de développement logiciel (SDK) qui nécessite un jeton, l’extrait de code suivant montre comment obtenir ce jeton.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;

// In the Program.cs, acquire a token for your downstream API

var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
ITokenAcquirer acquirer = tokenAcquirerFactory.GetTokenAcquirer();
AcquireTokenResult tokenResult = await acquirer.GetTokenForUserAsync(new[] { "https://graph.microsoft.com/.default" });
string accessToken = tokenResult.AccessToken;

Protocol

Si vous n’avez pas encore de bibliothèque pour la langue de votre choix, vous pouvez utiliser directement le protocole :

Premier cas : accéder à la demande de jeton à l’aide d’un secret partagé

POST /{tenant}/oauth2/v2.0/token HTTP/1.1           //Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=A1b-C2d_E3f.H4i,J5k?L6m!N7o-P8q_R9s.T0u
&grant_type=client_credentials

Deuxième cas : accéder à la demande de jeton à l’aide d’un certificat

POST /{tenant}/oauth2/v2.0/token HTTP/1.1               // Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_id=11112222-bbbb-3333-cccc-4444dddd5555
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=aaaaaaaa-0b0b-...
&grant_type=client_credentials

Pour plus d'informations, consultez la documentation du protocole : Plateforme d’identités Microsoft et flux d’informations d’identification du client OAuth 2.0.

Dépannage

Avez-vous utilisé l'étendue resource/.default ?

Si vous recevez un message d'erreur indiquant que vous avez utilisé une étendue non valide, cela signifie probablement que vous n'avez pas utilisé l'étendue resource/.default.

Si vous rencontrez l’erreur Privilèges insuffisants pour effectuer l’opération lors de l’appel de l’API, cela signifie que l’administrateur client doit accorder des autorisations à l’application.

Si vous n’accordez pas le consentement administrateur à votre application, vous rencontrez l’erreur suivante :

Failed to call the web API: Forbidden
Content: {
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "<guid>",
      "date": "<date>"
    }
  }
}

Sélectionnez l’une des options suivantes en fonction du rôle.

Administrateur de locataires général

Pour un administrateur client général, accédez à Applications d’entreprise dans le centre d’administration Microsoft Entra. Sélectionnez l’inscription de l’application, puis sélectionnez Autorisations dans la section Sécurité du volet gauche. Sélectionnez ensuite le grand bouton intitulé Octroyer un consentement d’administrateur pour {nom du locataire} (où {nom du locataire} est le nom du répertoire).

Utilisateur standard

Pour un utilisateur standard de votre locataire, demandez à un administrateur général de vous accorder le consentement administrateur pour l’application. Pour ce faire, fournissez l’URL suivante à l’administrateur :

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

Dans l’URL :

  • Remplacez Enter_the_Tenant_Id_Here par l’ID de locataire ou le nom de locataire (par exemple, contoso.microsoft.com).
  • Enter_the_Application_Id_Here est l’ID d’application (client) de l’application inscrite.

L’erreur AADSTS50011: No reply address is registered for the application peut s’afficher après avoir octroyé le consentement à l’application à l’aide de l’URL précédente. Cette erreur se produit parce que l’application et l’URL n’ont pas d’URI de redirection. Vous pouvez ignorer ce message.

Appelez-vous votre propre API ?

Si votre application démon appelle votre propre API web et que vous n’avez pas pu ajouter d’autorisation d’application à l’inscription de l’application du démon, vous devez Ajouter des rôles d’application à l’inscription d’application de l’API web.

Étapes suivantes

Passez à l’article suivant de ce scénario, Appeler une API web.