Partager via


Application web qui appelle des API web : Acquérir un jeton pour l’application

Vous avez généré l’objet de votre application cliente. À présent, vous devez l’utiliser pour acquérir un jeton afin d’appeler une API web. Dans ASP.NET ou ASP.NET Core, l’appel d’une API web s’effectue dans le contrôleur :

  • Obtenir un jeton pour l’API web en utilisant le cache de jetons. Pour recevoir ce jeton, vous appelez la méthode MSAL (Microsoft Authentication Library) AcquireTokenSilent (ou l’équivalent dans Microsoft.Identity.Web).
  • Appelez l’API protégée, en lui transmettant le jeton d’accès en tant que paramètre.

Microsoft.Identity.Web ajoute des méthodes d’extension qui fournissent des services pratiques pour appeler Microsoft Graph ou une API web en aval. Ces méthodes sont expliquées en détail dans Application web qui appelle des API web : Appeler une API. Avec ces méthodes d’assistance, vous n’avez pas besoin d’acquérir manuellement un jeton.

Toutefois, si vous souhaitez acquérir manuellement un jeton, le code suivant montre un exemple d’utilisation de Microsoft.Identity.Web pour le faire dans un contrôleur home. Il appelle Microsoft Graph à l’aide de l’API REST (au lieu du Kit de développement logiciel (SDK) Microsoft Graph). En règle générale, vous n’avez pas besoin d’obtenir un jeton, juste de créer un en-tête d’autorisation que vous ajoutez à votre requête. Pour obtenir un jeton d’autorisation, vous injectez le service IAuthorizationHeaderProvider par injection de dépendances dans le constructeur de votre contrôleur (ou votre constructeur de page si vous utilisez Blazor), puis vous l’utilisez dans les actions de votre contrôleur. Cette interface propose des méthodes qui produisent une chaîne contenant le protocole (Porteur, Pop, ...) et un jeton. Pour obtenir un en-tête d’autorisation pour appeler une API au nom de l’utilisateur, utilisez (CreateAuthorizationHeaderForUserAsync). Pour obtenir un en-tête d’autorisation pour appeler une API en aval pour le compte de l’application elle-même, dans un scénario démon, utilisez (CreateAuthorizationHeaderForAppAsync).

Les méthodes de contrôleur sont protégées par un attribut [Authorize] qui veille à ce que seuls des utilisateurs authentifiés puissent utiliser l’application web.

[Authorize]
public class HomeController : Controller
{
 readonly IAuthorizationHeaderProvider authorizationHeaderProvider;

 public HomeController(IAuthorizationHeaderProvider authorizationHeaderProvider)
 {
  this.authorizationHeaderProvider = authorizationHeaderProvider;
 }

 // Code for the controller actions (see code below)

}

ASP.NET Core rend IAuthorizationHeaderProvider disponible par injection de dépendances.

Voici le code simplifié pour l’action du HomeController, qui obtient un jeton pour appeler Microsoft Graph :

[AuthorizeForScopes(Scopes = new[] { "user.read" })]
public async Task<IActionResult> Profile()
{
 // Acquire the access token.
 string[] scopes = new string[]{"user.read"};
 string accessToken = await authorizationHeaderProvider.CreateAuthorizationHeaderForUserAsync(scopes);

 // Use the access token to call a protected web API.
 HttpClient client = new HttpClient();
 client.DefaultRequestHeaders.Add("Authorization", accessToken);
 string json = await client.GetStringAsync(url);
}

Pour mieux comprendre le code nécessaire dans ce scénario, consultez la phase 2 (2-1-Web App Calls Microsoft Graph) [Application web appelant Microsoft Graph] du tutoriel ms-identity-aspnetcore-webapp-tutorial.

L’attribut AuthorizeForScopes en haut de l’action du contrôleur (ou de la page Razor si vous utilisez un modèle Razor) est fourni par Microsoft.Identity.Web. Il s’assure que l’utilisateur est invité à donner son consentement, le cas échéant, et de façon incrémentielle.

Il existe d’autres variantes complexes, telles que :

  • Appels de plusieurs API.
  • Traitement du consentement incrémentiel et de l’accès conditionnel.

Ces étapes avancées sont abordées dans le chapitre 3 du tutoriel 3-WebApp-multi-APIs.

Étapes suivantes

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