Tutoriel : Accéder à Microsoft Graph à partir d’une application 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.
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
- Une application web s’exécutant sur Azure App Service et pour laquelle le module d’authentification/autorisation App Service est activé
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.)
Dans le menu centre d’administration Microsoft Entra, sélectionnez Applications.
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.
Sélectionnez Ajouter une autorisation, puis API Microsoft et Microsoft Graph.
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. En haut de la page, sélectionnez Lecture/écriture pour permettre la modification de vos ressources Azure.
Dans le navigateur de gauche, descendez dans la hiérarchie jusqu’à config>authsettingsV2.
Dans la vue authsettingsV2, sélectionnez Modifier. 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"
]
}
}
}
},
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
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 l’exemple sur GitHub.
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.GraphServiceClient dans votre projet à l’aide de l’interface de ligne de commande .NET (CLI) ou de la console du Gestionnaire de package dans Visual Studio.
CLI .NET
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.GraphServiceClient
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.
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
Microsoft Entra ID 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 Entra admin center. Select 'Endpoints' from the 'App registrations' blade and use the GUID in any of the URLs), e.g. aaaabbbb-0000-cccc-1111-dddd2222eeee]",
"ClientId": "[Enter the Client Id (Application ID obtained from the Microsoft Entra admin center), e.g. 00001111-aaaa-2222-bbbb-3333cccc4444]",
"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://learn.microsoft.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": "*"
}
Index.cshtml.cs
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.
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 terminé ce tutoriel et que vous n’avez plus besoin de l’application web ni des ressources associées, nettoyez les ressources que vous avez créées.