Permettre aux applications Java Tomcat de se connecter à l’aide de MSAL4J avec Azure Active Directory B2C
Cet article présente une application Java Tomcat qui authentifie les utilisateurs auprès d’Azure Active Directory B2C (Azure AD B2C) à l’aide de la Bibliothèque d’authentification Microsoft pour Java (MSAL4J).
Le diagramme suivant illustre la topologie de l’application :
L’application utilise MSAL4J pour connecter des utilisateurs et obtenir un jeton d’ID auprès d’Azure AD B2C. Le jeton d’ID prouve que l’utilisateur est authentifié auprès d’un locataire Azure AD B2C.
Prérequis
- JDK version 8 ou ultérieure
- Maven 3
- Un locataire Azure AD B2C. Pour en savoir plus, consultez le Tutoriel : Créer un client Azure Active Directory B2C
- Un compte d’utilisateur dans votre locataire Azure AD B2C.
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/1-Authentication/sign-in-b2c
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.
Inscrire l’exemple d’application auprès de votre locataire Azure AD B2C
L’exemple est fourni avec une application préinscrite à des fins de test. Si vous souhaitez utiliser votre propre locataire et application Azure AD B2C, suivez les étapes décrites dans les sections suivantes pour inscrire et configurer l’application dans le portail Azure. Sinon, passez aux étapes pour Exécuter l’exemple.
Choisissez le locataire Azure AD B2C où vous voulez créer vos applications.
Pour choisir votre locataire, suivez les étapes ci-dessous :
Connectez-vous au portail Azure.
Si votre compte figure dans plusieurs locataires Azure AD B2C, sélectionnez votre profil dans le coin du portail Azure, puis changer d’annuaire pour faire correspondre votre session de portail au locataire Azure AD B2C souhaité.
Créer des flux d’utilisateur et des stratégies personnalisées
Pour créer des flux d’utilisateurs pour l’inscription, la connexion, la modification de profil et la réinitialisation du mot de passe, consultez le Tutoriel : Créer des flux d’utilisateur dans Azure Active Directory B2C.
Vous devez également envisager de créer des Stratégies personnalisées dans Azure Active Directory B2C, mais cela dépasse l’étendue de ce tutoriel.
Ajouter des fournisseurs d’identité externes
Consultez le Tutoriel : Ajouter des fournisseurs d’identité à vos applications dans Azure Active Directory B2C.
Inscrire l’application (ms-identity-b2c-java-servlet-webapp-authentication)
Pour inscrire l’application, effectuez les étapes suivantes :
Accédez au portail Azure et sélectionnez Azure AD B2C.
Dans le volet de navigation, sélectionnez Inscriptions d’applications, puis 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
ms-identity-b2c-java-servlet-webapp-authentication
. - Sous Types de comptes pris en charge, sélectionnez Comptes dans un annuaire organisationnel et comptes personnels Microsoft (par exemple, Skype, Xbox, Outlook.com).
- Dans la section URI de redirection (facultatif), sélectionnez Web dans la zone de liste modifiable et entrez l’URI de redirection suivant :
http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/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.
Configurer l’application (ms-identity-b2c-java-servlet-webapp-authentication) 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 propriété
aad.clientId
et remplacez la valeur existante par l’ID d’application ou l’clientId
de l’applicationms-identity-b2c-java-servlet-webapp-authentication
que vous avez copiée à partir du portail Azure.Recherchez la propriété
aad.secret
et remplacez la valeur existante par celle que vous avez enregistrée lors de la création de l’applicationms-identity-b2c-java-servlet-webapp-authentication
dans le portail Azure.Recherchez la propriété
aad.scopes
et remplacez l’ID client d’application existant par la valeur que vous avez placée dansaad.clientId
à l’étape 1 de cette section.Recherchez la propriété
aad.authority
et remplacez la première instance defabrikamb2c
par le nom du locataire Azure AD B2C dans lequel vous avez créé l’applicationms-identity-b2c-java-servlet-webapp-authentication
dans le Portail Azure.Recherchez la propriété
aad.authority
et remplacez la deuxième instance defabrikamb2c
par le nom du locataire Azure AD B2C dans lequel vous avez créé l’applicationms-identity-b2c-java-servlet-webapp-authentication
dans le Portail Azure.Recherchez la propriété
aad.signInPolicy
et remplacez-la par le nom de la stratégie de flux utilisateur d’inscription/connexion que vous avez créée dans le locataire Azure AD B2C dans lequel vous avez créé l’applicationms-identity-b2c-java-servlet-webapp-authentication
dans le Portail Azure.Recherchez la propriété
aad.passwordResetPolicy
et remplacez-la par le nom de la stratégie de flux utilisateur de réinitialisation du mot de passe que vous avez créée dans le locataire Azure AD B2C dans lequel vous avez créé l’applicationms-identity-b2c-java-servlet-webapp-authentication
dans le Portail Azure.Recherchez la propriété
aad.editProfilePolicy
et remplacez-la par le nom de la stratégie de flux utilisateur de modification du profil que vous avez créée dans le locataire Azure AD B2C dans lequel vous avez créé l’applicationms-identity-b2c-java-servlet-webapp-authentication
dans le Portail Azure.
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.
- Dans la page suivante, suivez les instructions et connectez-vous avec un compte du fournisseur d’identité que vous avez choisi.
- 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.
- Vous avez également la possibilité de modifier votre profil. Sélectionnez le lien pour modifier les détails tels que votre nom d’affichage, votre lieu de résidence et votre profession.
- Utilisez le bouton dans le coin pour vous déconnecter.
- Après la déconnexion, accédez à l’URL suivante pour la page de détails du jeton :
http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_token_details
. Ici, vous pouvez constater que l’application affiche une erreur401: unauthorized
au lieu des revendications de jeton d’ID.
À propos du code
Cet exemple montre comment utiliser MSAL4J pour connecter des utilisateurs à votre locataire Azure AD B2C.
Contenu
Le tableau suivant montre le contenu de l’exemple de dossier du projet :
Fichier/Dossier | Description |
---|---|
AuthHelper.java | Fonctions d’assistance pour l’authentification. |
Config.java | S’exécute au démarrage et configure le lecteur de propriétés et l’enregistreur d’événements. |
authentication.properties | Configuration de Microsoft Entra ID et du programme. |
AuthenticationFilter.java | Redirige les demandes non authentifiées vers des ressources protégées vers une page 401. |
MsalAuthSession | Instancié avec une HttpSession . Stocke tous les attributs de session associés à MSAL dans l’attribut de session. |
____Servlet.java | Tous les points de terminaison disponibles sont définis dans les classe .java qui se terminent par ____Servlet.java. |
CHANGELOG.md | Liste des modifications apportées à l’exemple. |
CONTRIBUTING.md | Instructions pour contribuer à l’exemple. |
LICENCE | Licence de l’exemple. |
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 Azure AD B2C et d’échanger le jeton d’authentification contre un jeton d’accès.
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
.builder(CLIENT_ID, secret)
.b2cAuthority(AUTHORITY + policy)
.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é Azure AD B2C concaténée avec la
UserFlowPolicy
appropriée pour l’inscription, la connexion, la modification de profil ou la réinitialisation de mot de passe.
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
pour votre locataire Azure Active Directory B2C. L’instanceConfidentialClientApplication
MSAL4J est utilisée pour construire une URL de demande d’autorisation et l’application redirige le navigateur vers cette URL, comme illustré dans l’exemple suivant :final ConfidentialClientApplication client = getConfidentialClientInstance(policy); final AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters .builder(REDIRECT_URI, Collections.singleton(SCOPES)).responseMode(ResponseMode.QUERY) .prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build(); final String redirectUrl = client.getAuthorizationRequestUrl(parameters).toString(); Config.logger.log(Level.INFO, "Redirecting user to {0}", redirectUrl); resp.setStatus(302); resp.sendRedirect(redirectUrl);
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ù Azure AD B2C redirige le navigateur, ainsi que le code d’authentification, après avoir collecté les informations d’identification de l’utilisateur.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. Toutefois, MSAL4J exige que toutes les réponses depuis Azure AD B2C contiennent également un jeton d’accès.Pour qu’Azure AD B2C puisse fournir un jeton d’accès ainsi qu’un jeton d’ID, la demande doit inclure une étendue de ressource supplémentaire. Étant donné que cette application ne nécessite pas réellement une étendue de ressources externes, elle ajoute son propre ID client en tant que quatrième étendue afin de recevoir un jeton d’accès.
Vous trouverez la liste complète des étendues demandées par l’application dans le fichier authentication.properties.
ResponseMode.QUERY
: Azure AD B2C peut renvoyer la réponse sous forme de paramètres de formulaire dans une requête HTTP POST ou en tant que paramètres de chaîne de requête dans une requête HTTP GET.Prompt.SELECT_ACCOUNT
: Azure AD B2C doit demander à l’utilisateur de sélectionner le compte auprès duquel il tente de s’authentifier.state
: variable unique définie par l’application dans la session sur chaque demande de jeton et détruite après la réception du rappel de redirection Azure AD B2C correspondant. La variable d’état garantit que les demandes Azure AD B2C adressées au/auth_redirect endpoint
sont en fait des demandes d’autorisation Azure AD B2C provenant de cette application et de cette session, ce qui permet d’éviter les attaques CSRF. Cette opération est effectuée dans le fichier AADRedirectServlet.java.nonce
: variable unique définie par l’application dans la session sur chaque demande de jeton et détruite après réception du jeton correspondant. Ce nonce est transcrit pour les jetons distribués par Azure AD B2C, ce qui garantit qu’il n’y a pas d’attaque par relecture de jetons.
L’utilisateur reçoit une invite de connexion d’Azure Active Directory B2C. 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 d’Azure Active Directory B2C, comme indiqué dans l’exemple suivant :final AuthorizationCodeParameters authParams = AuthorizationCodeParameters .builder(authCode, new URI(REDIRECT_URI)) .scopes(Collections.singleton(SCOPES)).build(); final ConfidentialClientApplication client = AuthHelper .getConfidentialClientInstance(policy); final Future<IAuthenticationResult> future = client.acquireToken(authParams); final IAuthenticationResult result = future.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 de jeton sont extraites et la revendication du nonce est validée par auprès du nonce stocké dans la session, comme illustré dans l’exemple suivant :parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache); validateNonce(msalAuth) processSuccessfulAuthentication(msalAuth);
Si le nonce est correctement validé, l’état de l’authentification est placé dans une session côté serveur, en tirant parti des méthodes exposées par la classe
MsalAuthSession
, comme illustré dans l’exemple suivant :msalAuth.setAuthenticated(true); msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
Plus d’informations
- Qu’est-ce qu’Azure Active Directory B2C ?
- Types d’applications pouvant être utilisés dans Active Directory B2C
- Recommandations et meilleures pratiques pour Azure Active Directory B2C
- Session Azure AD B2C
- Bibliothèque d’authentification Microsoft (MSAL) pour Java
Pour en savoir plus sur le fonctionnement des protocoles OAuth 2.0 dans ce scénario et dans d’autres, consultez Scénarios d’authentification pour Microsoft Entra ID.