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
.
Avez-vous oublié de fournir le consentement administrateur ? Les applications démon en ont besoin !
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 d'applications cloud
Pour un Administrateur d’application cloud, 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 d’application cloud de vous accorder le consentement administrateur à 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.