Sécuriser les applications Java Tomcat à l’aide de groupes et de revendications de groupe
Cet article explique comment créer une application Java Tomcat qui connecte des utilisateurs avec la Bibliothèque d'authentification Microsoft (MSAL) pour Java. L’application restreint également l’accès aux pages en fonction de l’appartenance au groupe de sécurité Microsoft Entra ID.
Le diagramme suivant illustre la topologie de l’application :
L’application cliente utilise MSAL pour Java (MSAL4J) pour connecter des utilisateurs à un locataire d’ID Microsoft Entra et obtenir un jeton d’ID à partir de Microsoft Entra ID. Le jeton d’ID prouve qu’un utilisateur est authentifié auprès de ce locataire. L’application protège ses itinéraires en fonction de l’état d’authentification et de l’appartenance au groupe de l’utilisateur.
Pour voir une vidéo qui couvre ce scénario, consultez Implémenter l’autorisation dans vos applications avec des rôles d’application, des groupes de sécurité, des étendues et des rôles d’annuaire.
Prérequis
- JDK version 8 ou ultérieure
- Maven 3
- Un locataire Microsoft Entra ID. Pour en savoir plus, consultez Comment obtenir un locataire Microsoft Entra ID.
- Un compte d’utilisateur dans votre propre locataire Microsoft Entra ID.
- Deux groupes de sécurité,
GroupAdmin
etGroupMember
, contenant les utilisateurs avec utilisant lequel vous souhaitez effectuer des tests.
Recommandations
- Être familiarisé avec Java/Jakarta Servlets.
- Être familiarisé avec le terminal Linux/OSX.
- jwt.ms pour inspecter vos jetons.
- Fiddler pour la supervision de votre activité réseau et la résolution des problèmes.
- Suivez le blog Microsoft Entra ID pour rester au courant des dernières évolutions.
Configurer l’exemple
Les sections suivantes vous montrent comment configurer l’exemple d’application.
Clonez ou téléchargez l’exemple de dépôt
Pour cloner l’exemple, ouvrez une fenêtre Bash et utilisez la commande suivante :
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/3-Authorization-II/groups
Vous pouvez également accéder au dépôt ms-identity-msal-java-samples, puis le télécharger en tant que fichier .zip et l’extraire sur votre disque dur.
Important
Pour éviter les limitations de longueur de fichier sous Windows, clonez ou extrayez le dépôt dans un répertoire proche de la racine de votre disque dur.
Inscrivez l’exemple d’application auprès de votre locataire Microsoft Entra ID
Cet exemple contient un seul projet. Les sections suivantes vous montrent comment inscrire l’application à l’aide du Portail Azure.
Choisissez le locataire Microsoft Entra ID où vous voulez créer vos applications.
Pour choisir votre locataire, suivez les étapes ci-dessous :
Connectez-vous au portail Azure.
Si votre compte est présent dans plusieurs locataires Microsoft Entra ID, sélectionnez votre profil dans le coin du portail Azure, puis sélectionnez Changer d’annuaire pour faire correspondre votre session au locataire Microsoft Entra ID souhaité.
Inscrire l’application (java-servlet-webapp-groups)
Commencez par inscrire une nouvelle application dans le portail Azure en suivant les instructions de Démarrage rapide : inscrire une application sur la plateforme d’identité Microsoft.
Procédez comme suit pour compléter l’inscription :
Accédez à la page Inscriptions d’applications de la plateforme d’identités Microsoft pour les développeurs.
Sélectionnez Nouvelle inscription.
Dans la page Inscrire une application qui s’affiche, saisissez les informations suivantes relatives à l’inscription de votre application :
- Dans la section Nom, saisissez un nom d’application cohérent qui s’affichera pour les utilisateurs de l’application, par exemple
java-servlet-webapp-groups
. - Sous Types de comptes pris en charge, sélectionnez Comptes dans cet annuaire organisationnel uniquement.
- Dans la section URI de redirection, sélectionnez Web dans la zone de liste modifiable et entrez l’URI de redirection suivant :
http://localhost:8080/msal4j-servlet-groups/auth/redirect
.
- Dans la section Nom, saisissez un nom d’application cohérent qui s’affichera pour les utilisateurs de l’application, par exemple
Sélectionnez Inscrire pour créer l’application.
Dans la page d’inscription de l’application, recherchez et copiez la valeur ID d’application (client) pour l’utiliser ultérieurement. Vous utilisez cette valeur dans le ou les fichiers de configuration de votre application.
Cliquez sur Enregistrer pour enregistrer vos modifications.
Sur la page d’inscription de l’application, sélectionnez Certificats et secrets dans le volet de navigation pour ouvrir la page permettant de générer des secrets et de charger des certificats.
Dans la section Secrets client, sélectionnez Nouveau secret client.
Saisissez une description (par exemple, secret de l’application).
Sélectionnez l’une des durées disponibles : Dans 1 an, Dans 2 ans ou N’expire jamais.
Sélectionnez Ajouter. La valeur générée s’affiche.
Copiez et sauvegardez la valeur générée pour l’utiliser dans les étapes ultérieures. Vous avez besoin de cette valeur pour les fichiers de configuration de votre code. Cette valeur n’apparaîtra plus, et vous ne pouvez pas la récupérer par d’autres moyens. Veillez donc à la sauvegarder à partir du portail Azure avant d’accéder un autre écran ou à un autre volet.
Sur la page d’inscription de l’application, sélectionnez Autorisations d’API dans le volet de navigation pour ouvrir la page permettant d’ajouter l’accès aux API dont votre application a besoin.
Sélectionnez Ajouter une autorisation.
Vérifiez ensuite que l’onglet API Microsoft est sélectionné.
Dans la section API Microsoft couramment utilisées, sélectionnez Microsoft Graph.
Dans la section Autorisations déléguées, sélectionnez User.Read et GroupMember.Read.All dans la liste. Utilisez la zone de recherche au besoin.
Sélectionnez Ajouter des autorisations.
GroupMember.Read.All
nécessite le consentement de l’administrateur. Il faut donc sélectionner Accorder/révoquer le consentement de l’administrateur pour {locataire}, puis Oui lorsqu’il vous est demandé si vous souhaitez accorder le consentement pour les autorisations demandées pour tous les comptes du locataire. Pour effectuer cette action, vous devez être administrateur du locataire Microsoft Entra ID.
Configurer l’application (java-servlet-webapp-call-groups) pour utiliser l’inscription de votre application
Pour configurer l’application, procédez comme suit :
Remarque
Dans les étapes suivantes, ClientID
est identique à Application ID
ou AppId
.
Ouvrez le projet dans votre IDE.
Ouvrez le fichier ./src/main/resources/authentication.properties.
Recherchez la chaîne
{enter-your-tenant-id-here}
. Remplacez la valeur existante par votre ID de locataire Microsoft Entra si vous avez inscrit votre application avec l’option Comptes dans cet annuaire organisationnel uniquement.Recherchez la chaîne
{enter-your-client-id-here}
et remplacez la valeur existante par l’ID d’application ou l’clientId
de l’applicationjava-servlet-webapp-groups
que vous avez copié à partir du portail Azure.Recherchez la chaîne
{enter-your-client-secret-here}
et remplacez la valeur existante par celle que vous avez sauvegardée durant la création de l’applicationjava-servlet-webapp-groups
dans le portail Azure.
Configurer les groupes de sécurité
Vous disposez des options suivantes pour configurer vos applications afin qu’elles reçoivent les revendications des groupes :
Recevoir tous les groupes auxquels l’utilisateur connecté est affecté dans un locataire Microsoft Entra ID, y compris les groupes imbriqués. Pour en savoir plus, consultez la section Configurer votre application pour recevoir tous les groupes auxquels l’utilisateur connecté est affecté, y compris les groupes imbriqués.
Recevoir les valeurs des revendications des groupes d’un ensemble filtré de groupes avec lequel votre application est programmée pour fonctionner. Pour en savoir plus, consultez la section Configurer votre application pour recevoir les valeurs des revendications des groupes d’un ensemble filtré de groupes auxquels un utilisateur peut être affecté. Cette option n’est pas disponible dans l’édition gratuite de Microsoft Entra ID.
Remarque
Pour obtenir le samAccountName
ou l On Premises Group Security Identifier
au lieu de l’ID de groupe, consultez la section Conditions préalables à l’utilisation d’attributs de groupe synchronisés à partir d’Active Directory dans Configurer des revendications de groupe pour des applications à l’aide de Microsoft Entra ID.
Configurez votre application pour recevoir tous les groupes auxquels l’utilisateur connecté est affecté, y compris les groupes imbriqués
Suivez les étapes ci-dessous pour configurer votre application :
Sur la page d’inscription de l’application, sélectionnez Configuration du jeton dans le volet de navigation, pour ouvrir la page qui vous permet de configurer les jetons fournis par les revendications émis pour votre application.
Sélectionnez Ajouter une revendication de groupe pour ouvrir l’écran Modifier la revendication de groupes.
Sélectionnez Groupes de sécurité OU l’option Tous les groupes (inclut les listes de distribution mais pas les groupes affectés à l’application). Le fait de choisir les deux options annule l’effet de l’option Groupes de sécurité.
Dans la section ID, sélectionnez ID de groupe. Cette sélection fait que Microsoft Entra ID envoie l’ID d’objet des groupes auxquels l’utilisateur est affecté dans la revendication de groupe du jeton d’ID reçu par votre application après la connexion d’un utilisateur.
Configurer votre application pour recevoir les valeurs de revendication de groupes d’un ensemble filtré de groupes auxquels un utilisateur peut être affecté
Cette option est utile dans les cas suivants :
- Votre application s’intéresse à un ensemble sélectionné de groupes auxquels un utilisateur de connexion peut être affecté.
- Votre application n’est pas intéressée par chaque groupe de sécurité auquel cet utilisateur est affecté dans le locataire.
Cette option permet à votre application d’éviter le problème du dépassement.
Remarque
Cette fonctionnalité n’est pas disponible dans l’édition gratuite de Microsoft Entra ID.
Les affectations de groupe imbriquées ne sont pas disponibles avec cette option.
Pour activer cette option dans votre application, suivez les étapes ci-dessous :
Sur la page d’inscription de l’application, sélectionnez Configuration du jeton dans le volet de navigation, pour ouvrir la page qui vous permet de configurer les jetons fournis par les revendications émis pour votre application.
Sélectionnez Ajouter une revendication de groupe pour ouvrir l’écran Modifier la revendication de groupes.
Sélectionnez Groupes affectés à l’application.
Le fait de choisir d’autres options, telles que Groupes de sécurité ou Tous les groupes (y compris les listes de distribution, mais pas les groupes affectés à l’application), annule les avantages que cette option apporte à votre application.
Dans la section ID, sélectionnez ID de groupe. Cette sélection fait que Microsoft Entra ID envoie l’ID d’objet des groupes auxquels l’utilisateur est affecté dans la revendication de groupe du jeton d’ID.
Si vous exposez une API web à l’aide de l’option Exposer une API, vous pouvez également choisir l’option ID de groupe dans la section Accès. Cette option fait que Microsoft Entra ID envoie l’ID d’objet des groupes auxquels l’utilisateur est affecté dans la revendication de groupe du jeton d’accès.
Dans la page d’inscription de l’application, sélectionnez Vue d’ensemble dans le volet de navigation pour ouvrir l’écran vue d’ensemble de l’application.
Sélectionnez le lien portant le nom de votre application, sous Application managée dans l’annuaire local. Le titre de ce champ peut être tronqué, par exemple
Managed application in ...
. Lorsque vous sélectionnez ce lien, vous accédez à la page Vue d’ensemble de l’application d’entreprise associée au principal de service de votre application dans le locataire où vous l’avez créée. Vous pouvez revenir à la page d’inscription d’application à l’aide du bouton Précédent de votre navigateur.Sélectionnez Utilisateurs et groupes dans le volet de navigation pour ouvrir la page dans laquelle vous pouvez affecter des utilisateurs et des groupes à votre application.
Sélectionnez Ajouter un utilisateur.
Sélectionnez Utilisateur et groupes dans l’écran qui apparaît.
Choisissez les groupes que vous souhaitez affecter à cette application.
Sélectionnez Sélectionner pour terminer la sélection des groupes.
Sélectionnez Affecter pour terminer le processus d’affectation de groupe.
Votre application reçoit maintenant ces groupes sélectionnés dans la revendication de groupes lorsqu’un utilisateur qui se connecte à votre application est membre d’un ou plusieurs de ces groupes affectés.
Sélectionnez Propriétés dans le volet de navigation pour ouvrir la page qui répertorie les propriétés de base de votre application.Définissez l’indicateur Affectation d’utilisateurs requise ? sur Oui.
Important
Lorsque vous définissez Affectation d’utilisateurs requise ? sur Oui, Microsoft Entra ID vérifie que seuls les utilisateurs affectés à votre application dans le volet Utilisateurs et groupes sont en mesure de se connecter à votre application. Vous pouvez affecter des utilisateurs directement ou en affectant des groupes de sécurité auxquels ils appartiennent.
Configurer l’application (java-servlet-webapp-groups) pour reconnaître des ID de groupe
Pour configurer l’application, procédez comme suit :
Important
Dans la page Configuration du jeton, si vous avez choisi une autre option que groupID (par exemple DNSDomain\sAMAccountName), vous devez saisir le nom du groupe dans les étapes suivantes, par exemple, contoso.com\Test Group
au lieu de l’ID d’objet :
Ouvrez le fichier ./src/main/resources/authentication.properties.
Recherchez la chaîne
{enter-your-admins-group-id-here}
et remplacez la valeur existante par l’ID d’objet du groupeGroupAdmin
que vous avez copié à partir du portail Azure. Supprimez également les accolades de la valeur de l’espace réservé.Recherchez la chaîne
{enter-your-users-group-id-here}
et remplacez la valeur existante par l’ID d’objet du groupeGroupMember
que vous avez copié à partir du portail Azure. Supprimez également les accolades de la valeur de l’espace réservé.
Générer l’exemple
Pour générer l’exemple à l’aide de Maven, accédez au répertoire contenant le fichier pom.xml pour l’exemple, puis exécutez la commande suivante :
mvn clean package
Cette commande génère un fichier .war que vous pouvez exécuter sur différents serveurs d’applications.
Exécution de l'exemple
Les sections suivantes vous montrent comment déployer l’exemple dans Azure App Service.
Prérequis
Plug-in Maven pour les applications Azure App Service
Si Maven n’est pas votre outil de développement préféré, consultez les tutoriels similaires suivants qui utilisent d’autres outils :
Configurer le plug-in Maven
Lorsque vous déployez sur Azure App Service, le déploiement utilise automatiquement vos informations d’identification Azure depuis Azure CLI. Si Azure CLI n’est pas installé localement, le plug-in Maven s’authentifie avec OAuth ou la connexion de l’appareil. Pour plus d’informations, consultez Authentification avec les plug-ins Maven.
Pour configurer le plug-in, procédez comme suit :
Exécutez la commande suivante pour configurer le déploiement. Cette commande vous permet de configurer le système d’exploitation Azure App Service, les versions de Java et Tomcat.
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config
Pour Créer une nouvelle configuration d’exécution, appuyez sur Y, puis sur Entrée.
Pour Définir une valeur pour le système d’exploitation, appuyez sur 1 pour Windows ou 2 pour Linux, puis appuyez sur Entrée.
Pour Définir la valeur pour javaVersion, appuyez sur 2 pour Java 11, puis appuyez sur Entrée.
Pour Définir la valeur de webContainer, appuyez sur 4 pour Tomcat 9.0, puis sur Entrée.
Pour Définir la valeur de pricingTier, appuyez sur Entrée pour sélectionner le niveau P1v2 par défaut.
Pour Confirmer, appuyez sur Y, puis sur Entrée.
L’exemple suivant montre le résultat du processus de déploiement :
Please confirm webapp properties
AppName : msal4j-servlet-auth-1707209552268
ResourceGroup : msal4j-servlet-auth-1707209552268-rg
Region : centralus
PricingTier : P1v2
OS : Linux
Java Version: Java 11
Web server stack: Tomcat 9.0
Deploy to slot : false
Confirm (Y/N) [Y]: [INFO] Saving configuration to pom.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 37.112 s
[INFO] Finished at: 2024-02-06T08:53:02Z
[INFO] ------------------------------------------------------------------------
Une fois que vous avez confirmé vos choix, le plug-in ajoute l’élément de plug-in et les paramètres requis au fichier pom.xml de votre projet pour configurer votre application afin qu’elle s’exécute dans Azure App Service.
La partie concernée du fichier pom.xml doit ressembler à l’exemple suivant :
<build>
<plugins>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>>azure-webapp-maven-plugin</artifactId>
<version>x.xx.x</version>
<configuration>
<schemaVersion>v2</schemaVersion>
<resourceGroup>your-resourcegroup-name</resourceGroup>
<appName>your-app-name</appName>
...
</configuration>
</plugin>
</plugins>
</build>
Vous pouvez modifier les configurations d’App Service directement dans votre pom.xml. Certaines configurations courantes sont répertoriées dans le tableau suivant :
Propriété | Obligatoire | Description |
---|---|---|
subscriptionId |
false | L'ID de l'abonnement. |
resourceGroup |
true | Le groupe de ressources Azure pour votre application. |
appName |
true | Nom de votre application. |
region |
false | Région dans laquelle héberger votre application. La valeur par défaut est centralus . Pour connaître les régions valides, consultez la section Régions prises en charge. |
pricingTier |
false | Le niveau tarifaire pour votre application. La valeur par défaut est P1v2 pour une charge de travail de production. La valeur minimale recommandée pour le développement et le test Java est B2 . Pour en savoir plus, consultez Tarification d’App Service. |
runtime |
false | Configuration de l’environnement d’exécution. Pour plus d’informations, consultez Détails de configuration. |
deployment |
false | Configuration du déploiement. Pour plus d’informations, consultez Détails de configuration. |
Pour obtenir la liste complète des configurations, consultez la documentation de référence sur le plug-in. Tous les plug-ins Azure Maven partagent un ensemble commun de configurations. Pour ces configurations, voir Configurations communes. Pour les configurations spécifiques à Azure App Service, consultez Application Azure : détails de configuration.
Veillez à conserver les valeurs appName
et resourceGroup
pour une utilisation ultérieure.
Préparer l’application pour le déploiement
Lorsque vous déployez votre application sur App Service, votre URL de redirection devient l’URL de redirection de votre instance d’application déployée. Suivez les étapes ci-dessous pour modifier ces paramètres dans votre fichier des propriétés :
Naviguez jusqu’au fichier authentication.properties de votre application et remplacez la valeur
app.homePage
par le nom de domaine de votre application déployée, comme indiqué dans l’exemple suivant Par exemple, si vous avez choisiexample-domain
comme nom votre application à l’étape précédente, vous devez maintenant utiliserhttps://example-domain.azurewebsites.net
pour la valeurapp.homePage
. Assurez-vous d’avoir également remplacé le protocolehttp
parhttps
.# app.homePage is by default set to dev server address and app context path on the server # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net app.homePage=https://<your-app-name>.azurewebsites.net
Après avoir enregistré ce fichier, utilisez la commande suivante pour reconstruire votre application :
mvn clean package
Important
Dans ce même fichier authentication.properties, vous avez un paramètre pour votre aad.secret
. Il n’est pas recommandé de déployer cette valeur sur App Service. Il n’est pas non plus recommandé de laisser cette valeur dans votre code et de l’envoyer vers votre dépôt Git. Pour supprimer cette valeur secrète de votre code, vous trouverez des instructions plus détaillées dans la section Déployer sur App Service - Supprimer le secret. Ces instructions ajoutent des étapes supplémentaires pour envoyer la valeur secrète à Key Vault et utiliser les références Key Vault.
Mettez à jour l’enregistrement de votre application Microsoft Entra ID
Étant donné que l’URI de redirection change pour votre application déployée sur Azure App Service, vous devez également modifier l’URI de redirection dans votre enregistrement d’application Microsoft Entra ID. Pour cela, effectuez les étapes suivantes :
Accédez à la page Inscriptions d’applications de la plateforme d’identités Microsoft pour les développeurs.
Utilisez le champ de recherche pour rechercher l’enregistrement de votre application - par exemple,
java-servlet-webapp-authentication
.Ouvrez votre enregistrement d’application en sélectionnant son nom.
Sélectionnez Authentification dans le menu déroulant.
Dans la section Web - Redirection des URI, sélectionnez Ajouter un URI.
Remplissez l’URI de votre application, en ajoutant
/auth/redirect
- par exemple,https://<your-app-name>.azurewebsites.net/auth/redirect
.Cliquez sur Enregistrer.
Déployer l’application
Vous êtes maintenant prêt(e) à déployer votre application sur Azure App Service. Utilisez la commande suivante pour vous assurer que vous êtes connecté(e) à votre environnement Azure pour exécuter le déploiement :
az login
Une fois que la configuration est prête dans votre fichier pom.xml, vous pouvez utiliser la commande suivante pour déployer votre application Java sur Azure :
mvn package azure-webapp:deploy
Une fois le déploiement terminé, votre application est prête sur http://<your-app-name>.azurewebsites.net/
. Ouvrez l’URL avec votre navigateur web local, dans lequel doit s’afficher la page de démarrage de l’application msal4j-servlet-auth
.
Explorer l’exemple
Procédez comme suit pour examiner l’exemple :
- Notez l’état de connexion ou de déconnexion qui s’affiche au centre de l’écran.
- Sélectionnez le bouton contextuel dans le coin. Ce bouton indique Connexion lorsque vous exécutez l’application pour la première fois.
- Suivez les instructions de la page suivante et connectez-vous avec un compte dans le locataire Microsoft Entra ID.
- Sur l’écran de consentement, notez les portées demandées.
- Notez que le bouton contextuel indique maintenant Déconnexion et affiche votre nom d’utilisateur.
- Sélectionnez Détails du jeton d’ID pour voir certaines des revendications décodées du jeton d’ID.
- Sélectionnez Groupes pour afficher des informations sur l’appartenance aux groupes de sécurité de l’utilisateur connecté.
- Sélectionnez Administrateur uniquement ou Utilisateur standard pour accéder aux points de terminaison protégés des groupes de revendications.
- Si votre utilisateur connecté se trouve dans le groupe
GroupAdmin
, l’utilisateur peut accéder aux deux pages. - Si votre utilisateur connecté se trouve dans le groupe
GroupMember
, l’utilisateur peut uniquement accéder à la Utilisateur standard. - Si votre utilisateur connecté ne figure dans aucun groupe, il ne peut accéder à aucune des deux pages.
- Si votre utilisateur connecté se trouve dans le groupe
- Utilisez le bouton dans le coin pour vous déconnecter.
- Après la déconnexion, sélectionnez Détails du jeton d’ID pour constater que l’application affiche une erreur
401: unauthorized
au lieu des revendications de jeton d’ID lorsque l’utilisateur n’est pas autorisé.
À propos du code
Dans cet exemple, nous utilisons MSAL pour Java (MSAL4J) pour connecter un utilisateur et obtenir un jeton d’ID susceptible de contenir la revendication des groupes. S’il y a trop de groupes pour l’émission dans le jeton ID, l’exemple utilise Microsoft Graph SDK for Java pour obtenir les données d’appartenance à un groupe à partir de Microsoft Graph. En fonction des groupes auxquels appartient l’utilisateur, l’utilisateur connecté peut accéder à aucune, à une ou aux deux des pages protégées, Admins Only
et Regular Users
.
Si vous souhaitez répliquer le comportement de cet exemple, vous devez ajouter MSAL4J et microsoft Graph SDK à vos projets à l’aide de Maven. Vous pouvez copier le fichier pom.xml et le contenu des dossiers helpers et authservlets dans le dossier src/main/java/com/microsoft/azuresamples/msal4j. Vous avez également besoin du fichier authentication.properties. Ces classes et ces fichiers contiennent du code générique que vous pouvez utiliser dans un large éventail d’applications. Vous pouvez également copier le reste de l’exemple, mais les autres classes et fichiers sont créés spécifiquement aux fins de l’objectif de cet exemple.
Contenu
Le tableau suivant montre le contenu de l’exemple de dossier du projet :
Fichier/Dossier | Description |
---|---|
src/main/java/com/microsoft/azuresamples/msal4j/groupswebapp/ | Ce répertoire contient les classes qui définissent la logique métier principale de l’application. |
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ | Ce répertoire contient les classes utilisées pour les points de terminaison de connexion et de déconnexion. |
____Servlet.java | Tous les points de terminaison disponibles sont définis dans les classe .java qui se terminent par ____Servlet.java. |
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ | Classes d’assistance pour l’authentification. |
AuthenticationFilter.java | Redirige les demandes non authentifiées vers des points de terminaison protégés vers une page 401. |
src/main/resources/authentication.properties | Configuration de Microsoft Entra ID et du programme. |
src/main/webapp/ | Ce répertoire contient l’interface utilisateur - Modèles JSP |
CHANGELOG.md | Liste des modifications apportées à l’exemple. |
CONTRIBUTING.md | Instructions pour contribuer à l’exemple. |
LICENCE | Licence de l’exemple. |
Traiter une revendication de groupe dans les jetons, y compris la gestion du dépassement
Les sections suivantes décrivent la façon dont l’application traite une revendication de groupe.
Revendication de groupes
L’ID d’objet des groupes de sécurité dont l’utilisateur connecté est membre est renvoyé dans la revendication de groupes du jeton, comme dans l’exemple suivant :
{
...
"groups": [
"0bbe91cc-b69e-414d-85a6-a043d6752215",
"48931dac-3736-45e7-83e8-015e6dfd6f7c",]
...
}
Revendication de dépassement des groupes
Pour s’assurer que la taille du jeton ne dépasse pas les limites de taille d’en-tête HTTP, la plateforme d’identité Microsoft limite le nombre d’ID d’objets inclus dans la revendication des groupes.
La limite de dépassement est de 150 pour les jetons SAML, de 200 pour les jetons JWT et de 6 pour les applications Single Page. Si un utilisateur est membre d’un nombre de groupes supérieur à la limite de dépassement, la plateforme d’identité Microsoft n’émet pas les ID de groupe dans les groupes revendiqués dans le jeton. Au lieu de cela, il inclut une revendication de dépassement dans le jeton qui indique à l’application d’interroger l’API Microsoft Graph pour récupérer l’appartenance de groupe de l’utilisateur, comme le montre l’exemple suivant :
{
...
"_claim_names": {
"groups": "src1"
},
{
"_claim_sources": {
"src1": {
"endpoint":"[Graph Url to get this user's group membership from]"
}
}
...
}
Créer le scénario de dépassement dans cet exemple pour les tests
Pour créer le scénario de dépassement, vous pouvez effectuer les étapes suivantes :
Vous pouvez utiliser le fichier BulkCreateGroups.ps1 fourni dans le dossier AppCreationScripts pour créer un grand nombre de groupes et leur affecter des utilisateurs. Ce fichier permet de tester les scénarios de dépassement pendant le développement. N’oubliez pas de modifier l’
objectId
de l’utilisateur fournie dans le script BulkCreateGroups.ps1.Lorsque vous exécutez cet exemple et qu’un dépassement se produit, vous voyez le
_claim_names
sur la page d’accueil après la connexion de l’utilisateur.Nous vous conseillons vivement d’utiliser la fonctionnalité de filtrage de groupe, le cas échéant, pour éviter que des dépassements de groupe ne surviennent. Pour en savoir plus, consultez la section Configurer votre application pour recevoir les valeurs des revendications des groupes d’un ensemble filtré de groupes auxquels un utilisateur peut être affecté.
Si vous ne pouvez pas éviter la survenance d’un dépassement de groupe, nous vous suggérons de suivre les étapes ci-dessous pour traiter la revendication des groupes dans votre jeton :
- Recherchez la revendication
_claim_names
avec l’une des valeurs étant groupes. Cette revendication indique un dépassement. - Si vous la trouvez, effectuez un appel au point de terminaison spécifié dans
_claim_sources
pour récupérer les groupes de l’utilisateur. - Si vous n’en trouvez aucune, examinez la revendication des groupes pour les groupes de l’utilisateur.
- Recherchez la revendication
Remarque
La gestion du dépassement nécessite un appel à Microsoft Graph pour lire les appartenances de groupe de l’utilisateur connecté. Par conséquent, votre application doit disposer de l’autorisation GroupMember.Read.All pour que la fonction getMemberObjects s’exécute correctement.
Pour en savoir plus sur la programmation de Microsoft Graph, consultez la vidéo Présentation de Microsoft Graph pour les développeurs.
ConfidentialClientApplication
Une ConfidentialClientApplication
instance est créée dans le fichier AuthHelper.java, comme le montre l’exemple suivant. Cet objet permet de créer l’URL d’autorisation de Microsoft Entra et d’échanger le jeton d’authentification contre un jeton d’accès.
// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
.builder(CLIENT_ID, secret)
.authority(AUTHORITY)
.build();
Les paramètres suivants sont utilisés pour l’instanciation :
- ID client de l’application.
- Secret client, lequel est une exigence pour les applications clientes confidentielles.
- L’autorité Microsoft Entra ID, qui inclut votre ID de locataire Microsoft Entra.
Dans cet exemple, ces valeurs sont lues à partir du fichier authentication.properties avec un lecteur de propriétés dans le fichier Config.java.
Procédure pas-à-pas
Les étapes suivantes présentent le fonctionnement détaillé de l’application :
La première étape du processus de connexion consiste à envoyer une demande au point de terminaison
/authorize
de votre locataire Microsoft Entra ID. L’instanceConfidentialClientApplication
MSAL4J est utilisée pour construire une URL de demande d’autorisation. L’application redirige le navigateur vers cette URL, où l’utilisateur se connecte.final ConfidentialClientApplication client = getConfidentialClientInstance(); AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES)) .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build(); final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString(); contextAdapter.redirectUser(authorizeUrl);
La liste suivante décrit les fonctionnalités de ce code :
AuthorizationRequestUrlParameters
: paramètres qui doivent être définis pour générer un AuthorizationRequestUrl.REDIRECT_URI
: où Microsoft Entra redirige le navigateur, avec le code d’authentification, après avoir collecté les informations d’identification de l’utilisateur. Il doit correspondre à l’URI de redirection dans l’inscription de l’application Microsoft Entra ID sur le portail Azure.SCOPES
: les Étendues sont des autorisations demandées par l’application.- Normalement, les trois étendues
openid profile offline_access
suffisent pour recevoir une réponse du jeton d’ID. - Vous trouverez la liste complète des étendues demandées par l’application dans le fichier authentication.properties. Vous pouvez ajouter d’autres étendues telles que
User.Read
.
- Normalement, les trois étendues
L’utilisateur reçoit une invite de connexion de Microsoft Entra ID. Si la tentative de connexion réussit, le navigateur de l’utilisateur est redirigé vers le point de terminaison de redirection de l’application. Une requête valide à ce point de terminaison contient un code d’autorisation.
L’instance
ConfidentialClientApplication
échange ensuite ce code d’autorisation contre un jeton d’ID et un jeton d’accès à partir de Microsoft Entra ID.// First, validate the state, then parse any error codes in response, then extract the authCode. Then: // build the auth code params: final AuthorizationCodeParameters authParams = AuthorizationCodeParameters .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build(); // Get a client instance and leverage it to acquire the token: final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance(); final IAuthenticationResult result = client.acquireToken(authParams).get();
La liste suivante décrit les fonctionnalités de ce code :
AuthorizationCodeParameters
: paramètres qui doivent être définis pour échanger le code d’autorisation contre un ID et/ou un jeton d’accès.authCode
: code d’autorisation reçu au niveau du point de terminaison de redirection.REDIRECT_URI
: l’URI de redirection utilisé à l’étape précédente doit être repassé.SCOPES
: les étendues utilisées à l’étape précédente doivent être repassées.
Si
acquireToken
réussit, les revendications du jeton sont extraites. Si le contrôle nonce réussit, les résultats sont placés danscontext
(instance deIdentityContextData
) et enregistrés dans la session. L’application peut ensuite instancier lesIdentityContextData
à partir de la session (au moyen d’une instance deIdentityContextAdapterServlet
) chaque fois qu’elle a besoin d’y accéder, comme montré dans le code suivant :// parse IdToken claims from the IAuthenticationResult: // (the next step - validateNonce - requires parsed claims) context.setIdTokenClaims(result.idToken()); // if nonce is invalid, stop immediately! this could be a token replay! // if validation fails, throws exception and cancels auth: validateNonce(context); // set user to authenticated: context.setAuthResult(result, client.tokenCache().serialize()); // handle groups overage if it has occurred. handleGroupsOverage(contextAdapter);
Après l’étape précédente, vous pouvez extraire les appartenances aux groupes en appelant
context.getGroups()
à l’aide d’une instance deIdentityContextData
.Si l’utilisateur est membre d’un trop grand nombre de groupes (plus de 200), un appel à
context.getGroups()
pourrait être vide s’il n’y avait pas l’appel àhandleGroupsOverage()
. Pendant ce temps,context.getGroupsOverage()
renvoietrue
signalant qu’un dépassement s’est produit et que l’obtention de la liste complète des groupes nécessite un appel à Microsoft Graph. Consultez la méthodehandleGroupsOverage()
dans AuthHelper.java pour voir comment cette application utilisecontext.setGroups()
en cas de dépassement.
Protéger les itinéraires
Consultez AuthenticationFilter.java pour voir comment l’exemple d’application filtre l’accès aux itinéraires. Dans le fichier authentication.properties, la propriété app.protect.authenticated
contient les itinéraires séparés par des virgules auxquels seuls les utilisateurs authentifiés peuvent accéder, comme illustré dans l’exemple suivant :
# for example, /token_details requires any user to be signed in and does not require special groups claim
app.protect.authenticated=/token_details
Les itinéraires répertoriés dans les ensembles de règles séparés par des virgules sous le app.protect.groups
ont également hors limites pour les utilisateurs non authentifiés, comme le montre l’exemple suivant. Toutefois, ces itinéraires contiennent également une liste d’appartenances à des groupes, séparée par des espaces. Seuls les utilisateurs appartenant à au moins un des groupes correspondants peuvent accéder à ces itinéraires après s’être authentifiés.
# define short names for group IDs here for the app. This is useful in the next property (app.protect.groups).
# EXCLUDE the curly braces, they are in this file only as delimiters.
# example:
# app.groups=groupA abcdef-qrstuvw-xyz groupB abcdef-qrstuv-wxyz
app.groups=admin {enter-your-admins-group-id-here}, user {enter-your-users-group-id-here}
# A route and its corresponding group(s) that can view it, <space-separated>; the start of the next route & its group(s) is delimited by a <comma-and-space-separator>
# this says: /admins_only can be accessed by admin group, /regular_user can be accessed by admin group and user group
app.protect.groups=/admin_only admin, /regular_user admin user
Étendues
Les étendues indiquent à Microsoft Entra ID le niveau d’accès demandé par l’application.
Selon les étendues demandées, Microsoft Entra ID affiche une boîte de dialogue invitant l’utilisateur à donner son consentement au moment de la connexion. Si l’utilisateur donne son consentement pour une ou plusieurs étendues et obtient un jeton, les étendues qui ont fait l’objet d’un consentement sont encodées dans le access_token
obtenu.
Pour connaître les étendues demandées par l’application, consultez authentication.properties. Par défaut, l’application définit la valeur des étendues sur GroupMember.Read.All
. Cette étendue de l’API Microsoft Graph particulière est requise si l’application doit appeler Graph pour obtenir les appartenances aux groupes de l’utilisateur.
Plus d’informations
- Bibliothèque d’authentification Microsoft (MSAL) pour Java
- Plate-forme d’identité Microsoft (Microsoft Entra ID pour les développeurs)
- Démarrage rapide : Inscrire une application à l’aide de la plateforme d’identités Microsoft
- Comprendre les expériences de consentement à l’application Microsoft Entra ID
- Comprendre le consentement de l’utilisateur et de l’administrateur
- Exemples de code MSAL