Tutoriel : Accéder à Microsoft Graph à partir d’une application . NET sécurisée en tant qu’utilisateur

Découvrez comment accéder à Microsoft Graph à partir d’une application web s’exécutant sur Azure App Service.

Diagramme illustrant l’accès à Microsoft Graph.

Vous souhaitez ajouter l’accès à Microsoft Graph à partir de votre application web et effectuer une action en tant qu’utilisateur connecté. Cette section décrit comment accorder des permissions déléguées à l’application web et comment récupérer les informations de profil de l’utilisateur connecté à partir de Microsoft Entra ID.

Dans ce tutoriel, vous allez apprendre à :

  • Accorder des autorisations déléguées à une application web.
  • Appeler Microsoft Graph à partir d’une application web pour le compte d’un utilisateur connecté.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit Azure avant de commencer.

Prérequis

Accorder un accès au front-end pour appeler Microsoft Graph

Maintenant que vous avez activé l’authentification et l’autorisation sur votre application web, celle-ci est inscrite auprès de la plateforme d’identités Microsoft et secondée par une application Microsoft Entra. Lors de cette étape, vous allez accorder à l’application web des autorisations afin qu’elle puisse accéder à Microsoft Graph pour le compte de l’utilisateur. (Techniquement, vous allez accorder à l’application Microsoft Entra de l’application web les autorisations nécessaires pour accéder à l’application Microsoft Entra de Microsoft Graph pour le compte de l’utilisateur.)

  1. Dans le Centre d’administration Microsoft Entra, sélectionnez Applications.

  2. Sélectionnez Inscriptions d’applications>Applications détenues>Afficher toutes les applications de cet annuaire. Sélectionnez le nom de votre application web, puis Autorisations des API.

  3. Sélectionnez Ajouter une autorisation, puis API Microsoft et Microsoft Graph.

  4. Sélectionnez Autorisations déléguées, puis Utilisateur.Lecture dans la liste. Sélectionnez Ajouter des autorisations.

Configurer App Service pour renvoyer un jeton d’accès utilisable

L’application web dispose maintenant des autorisations nécessaires pour accéder à Microsoft Graph en tant qu’utilisateur connecté. Lors de cette étape, vous allez configurer l’authentification et l’autorisation App Service afin d’obtenir un jeton d’accès utilisable pour accéder à Microsoft Graph. Pour cette étape, vous devez ajouter l’étendue User.Read pour le service en aval (Microsoft Graph) : https://graph.microsoft.com/User.Read.

Important

Si vous ne configurez pas App Service pour retourner un jeton d’accès utilisable, vous recevez une erreur CompactToken parsing failed with error code: 80049217 lorsque vous appelez des API Microsoft Graph dans votre code.

Accédez à Azure Resource Explorer et utilisez l’arborescence de ressources pour localiser votre application web. L’URL de ressource doit ressembler à https://resources.azure.com/subscriptions/subscriptionId/resourceGroups/SecureWebApp/providers/Microsoft.Web/sites/SecureWebApp20200915115914.

Azure Resource Explorer est désormais ouvert avec votre application web sélectionnée dans l’arborescence des ressources.

  1. En haut de la page, sélectionnez Lecture/écriture pour permettre la modification de vos ressources Azure.

  2. Dans le navigateur de gauche, descendez dans la hiérarchie jusqu’à config>authsettingsV2.

  3. Dans la vue authsettingsV2, sélectionnez Modifier.

  4. Recherchez la section login de identityProviders ->azureActiveDirectory et ajoutez les paramètres loginParameters suivants : "loginParameters":[ "response_type=code id_token","scope=openid offline_access profile https://graph.microsoft.com/User.Read" ].

    "identityProviders": {
        "azureActiveDirectory": {
          "enabled": true,
          "login": {
            "loginParameters":[
              "response_type=code id_token",
              "scope=openid offline_access profile https://graph.microsoft.com/User.Read"
            ]
          }
        }
      }
    },
    
  5. Enregistrez vos paramètres en sélectionnant PUT. La prise en compte de ce paramètre peut prendre plusieurs minutes. Votre application web est maintenant configurée pour accéder à Microsoft Graph avec un jeton d’accès approprié. Si ce n’est pas le cas, Microsoft Graph retourne une erreur indiquant que le format du jeton compact est incorrect.

Appeler Microsoft Graph avec .NET

Votre application web dispose désormais des autorisations nécessaires, et ajoute également l’ID client de Microsoft Graph aux paramètres de connexion.

À l’aide de la bibliothèque Microsoft.Identity.Web, l’application web obtient un jeton d’accès pour l’authentification auprès de Microsoft Graph. Dans la version 1.2.0 et ultérieures, la bibliothèque Microsoft.Identity.Web s’intègre à et peut s’exécuter parallèlement au module d’authentification/d’autorisation App Service. Microsoft.Identity.Web détecte que l’application web est hébergée dans App Service et obtient le jeton d’accès à partir du module d’authentification/d’autorisation App Service. Le jeton d’accès est ensuite transmis aux requêtes authentifiées avec l’API Microsoft Graph.

Pour voir ce code dans un exemple d’application, consultez :

Notes

La bibliothèque Microsoft.Identity.Web n’est pas nécessaire dans votre application web pour l’authentification/autorisation de base, ni pour authentifier les demandes auprès de Microsoft Graph. Il est possible d’appeler de manière sécurisée les API en aval avec uniquement le module d’authentification/autorisation App Service activé.

Toutefois, l’authentification/autorisation App Service est conçue pour les scénarios d’authentification de base. Pour les scénarios plus complexes (par exemple la gestion des revendications personnalisées), vous avez besoin de la bibliothèque Microsoft.Identity.Web ou de la bibliothèque d’authentification Microsoft. Les tâches d’installation et de configuration sont un peu plus longues au début, mais la bibliothèque Microsoft.Identity.Web peut s’exécuter en même temps que le module d’authentification/autorisation App Service. Plus tard, lorsque votre application web devra gérer des scénarios plus complexes, vous pourrez désactiver le module d’authentification/autorisation App Service, et Microsoft.Identity.Web fera déjà partie de votre application.

Installer des packages de bibliothèque de client

Installez les packages NuGet Microsoft.Identity.Web et Microsoft.Identity.Web.MicrosoftGraph dans votre projet à l’aide de l’interface de ligne de commande .NET Core ou de la console du gestionnaire de package dans Visual Studio.

Ligne de commande .NET Core

Ouvrez une ligne de commande et basculez vers le répertoire qui contient votre fichier projet.

Exécutez les commandes d’installation.

dotnet add package Microsoft.Identity.Web.MicrosoftGraph

dotnet add package Microsoft.Identity.Web

Console du Gestionnaire de package

Ouvrez le projet/la solution dans Visual Studio, puis ouvrez la console à l’aide de la commande Outils>Gestionnaire de package NuGet>Console du gestionnaire de package.

Exécutez les commandes d’installation.

Install-Package Microsoft.Identity.Web.GraphServiceClient

Install-Package Microsoft.Identity.Web

Startup.cs

Dans le fichier Startup.cs, la méthode AddMicrosoftIdentityWebApp ajoute Microsoft.Identity.Web à votre application web. La méthode AddMicrosoftGraph ajoute la prise en charge de Microsoft Graph. Pour plus d’informations sur la gestion du consentement incrémentiel et de l’accès conditionnel, lisez ceci.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Identity.Web;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;

// Some code omitted for brevity.
public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddOptions();
      string[] initialScopes = Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' ');

      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
              .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
                      .AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))
                      .AddInMemoryTokenCaches(); 

      services.AddAuthorization(options =>
      {
          // By default, all incoming requests will be authorized according to the default policy
          options.FallbackPolicy = options.DefaultPolicy;
      });
      services.AddRazorPages()
          .AddMvcOptions(options => {})                
          .AddMicrosoftIdentityUI();

      services.AddControllersWithViews()
              .AddMicrosoftIdentityUI();
    }
}

appsettings.json

AzureAd spécifie la configuration de la bibliothèque Microsoft.Identity.Web. Dans le centre d’administration Microsoft Entra, sélectionnez Applications dans le menu du portail, puis inscriptions d'applications. Sélectionnez l’inscription d’application créée lorsque vous avez activé le module d’authentification/autorisation App Service. (L’inscription d’application doit avoir le même nom que votre application web.) Vous trouverez l’ID de locataire et l’ID client dans la page de vue d’ensemble de l’inscription d’application. Le nom de domaine est indiqué sur la page de présentation Microsoft Entra de votre locataire.

Graphe spécifie le point de terminaison Microsoft Graph et les étendues initiales nécessaires à l’application.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "[Enter the domain of your tenant, e.g. contoso.onmicrosoft.com]",
    "TenantId": "[Enter 'common', or 'organizations' or the Tenant Id (Obtained from the Microsoft Entra admin center. Select 'Endpoints' from the 'App registrations' blade and use the GUID in any of the URLs), e.g. da41245a5-11b3-996c-00a8-4d99re19f292]",
    "ClientId": "[Enter the Client Id (Application ID obtained from the Microsoft Entra admin center), e.g. ba74781c2-53c2-442a-97c2-3d60re42f403]",
    "ClientSecret": "[Copy the client secret added to the app from the Microsoft Entra admin center]",
    "ClientCertificates": [
    ],
    // the following is required to handle Continuous Access Evaluation challenges
    "ClientCapabilities": [ "cp1" ],
    "CallbackPath": "/signin-oidc"
  },
  "DownstreamApis": {
    "MicrosoftGraph": {
      // Specify BaseUrl if you want to use Microsoft graph in a national cloud.
      // See https://video2.skills-academy.com/graph/deployments#microsoft-graph-and-graph-explorer-service-root-endpoints
      // "BaseUrl": "https://graph.microsoft.com/v1.0",

      // Set RequestAppToken this to "true" if you want to request an application token (to call graph on 
      // behalf of the application). The scopes will then automatically
      // be ['https://graph.microsoft.com/.default'].
      // "RequestAppToken": false

      // Set Scopes to request (unless you request an app token).
      "Scopes": [ "User.Read" ]

      // See https://aka.ms/ms-id-web/downstreamApiOptions for all the properties you can set.
    }
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Appeler Microsoft Graph pour le compte de l’utilisateur

L’exemple suivant montre comment appeler Microsoft Graph en tant qu’utilisateur connecté et comment récupérer des informations utilisateur. L’objet GraphServiceClient est injecté dans le contrôleur et l’authentification a été configurée pour vous par la bibliothèque Microsoft.Identity.Web.

// Index.cshtml.cs
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Graph;
using System.IO;
using Microsoft.Identity.Web;
using Microsoft.Extensions.Logging;

// Some code omitted for brevity.

[AuthorizeForScopes(Scopes = new[] { "User.Read" })]
public class IndexModel : PageModel
{
    private readonly ILogger<IndexModel> _logger;
    private readonly GraphServiceClient _graphServiceClient;

    public IndexModel(ILogger<IndexModel> logger, GraphServiceClient graphServiceClient)
    {
        _logger = logger;
        _graphServiceClient = graphServiceClient;
    }

    public async Task OnGetAsync()
    {
        try
        {
            var user = await _graphServiceClient.Me.GetAsync();
            ViewData["Me"] = user;
            ViewData["name"] = user.DisplayName;

            using (var photoStream = await _graphServiceClient.Me.Photo.Content.GetAsync())
            {
                byte[] photoByte = ((MemoryStream)photoStream).ToArray();
                ViewData["photo"] = Convert.ToBase64String(photoByte);
            }
        }
        catch (Exception ex)
        {
            ViewData["photo"] = null;
        }
    }
}

Nettoyer les ressources

Si vous avez effectué toutes les étapes de ce tutoriel en plusieurs parties, vous avez créé une instance App Service, un plan d’hébergement App Service et un compte de stockage dans un groupe de ressources. Vous avez également créé une inscription d’application dans Microsoft Entra ID. Si vous avez choisi une configuration externe, vous avez peut-être créé un locataire externe. Lorsque vous n’en avez plus besoin, supprimez ces ressources et l’inscription d’application afin de ne pas continuer à accumuler des frais.

Dans ce tutoriel, vous allez apprendre à :

  • Supprimer les ressources Azure créées durant le tutoriel.

Supprimer le groupe de ressources

Sur le Portail Azure, sélectionnez Groupes de ressources dans le menu du portail, puis sélectionnez le groupe de ressources qui contient votre instance App Service et votre plan App Service.

Sélectionnez Supprimer le groupe de ressources pour supprimer le groupe de ressources et toutes les ressources.

Capture d’écran montrant la suppression du groupe de ressources.

L’exécution de cette commande peut prendre plusieurs minutes.

Supprimer l’inscription d’application

Dans le Centre d’administration Microsoft Entra, sélectionnez Applications>Inscriptions d’applications. Sélectionnez ensuite l’application que vous avez créée. Capture d’écran montrant la sélection de l’inscription de l’application.

Dans la vue d’ensemble de l’inscription d’application, sélectionnez Supprimer. Capture d’écran montrant la suppression de l’inscription de l’application.

Supprimer le locataire externe

Si vous avez créé un locataire externe, vous pouvez le supprimer. Dans le centre d’administration Microsoft Entra, accédez à Identity>Vue d’ensemble>Gérer les locataires.

Sélectionnez le serveur que vous souhaitez supprimer, puis Supprimer.

Il est possible que vous deviez effectuer les actions requises avant de pouvoir supprimer le tenant. Par exemple, vous devrez peut-être supprimer tous les flux d’utilisateurs et les inscriptions d’applications dans le locataire.

Si vous êtes prêt à supprimer le tenant, sélectionnez Supprimer.

Étapes suivantes

Dans ce didacticiel, vous avez appris à :

  • Accorder des autorisations déléguées à une application web.
  • Appeler Microsoft Graph à partir d’une application web pour le compte d’un utilisateur connecté.