Aktivera inloggning för Java Tomcat-appar med Microsoft Entra-ID
Den här artikeln visar en Java Tomcat-app som loggar in användare till din Microsoft Entra ID-klientorganisation med hjälp av Microsoft Authentication Library (MSAL) för Java.
Följande diagram visar appens topologi:
Klientappen använder MSAL för Java (MSAL4J) för att logga in användare till sin egen Microsoft Entra ID-klientorganisation och hämta en ID-token från Microsoft Entra-ID. ID-token bevisar att en användare autentiseras med den här klientorganisationen. Appen skyddar sina vägar enligt användarens autentiseringsstatus.
Förutsättningar
- JDK version 8 eller senare
- Maven 3
- En Microsoft Entra-ID-klientorganisation. Mer information finns i Hämta en Microsoft Entra-ID-klientorganisation.
- Ett användarkonto i din egen Microsoft Entra-ID-klientorganisation om du bara vill arbeta med konton i din organisationskatalog – det vill sa i läget för en enda klientorganisation. Om du inte har skapat ett användarkonto i din Microsoft Entra ID-klientorganisation bör du göra det innan du fortsätter. Mer information finns i Skapa, bjuda in och ta bort användare.
- Ett användarkonto i en organisations Microsoft Entra-ID-klientorganisation om du vill arbeta med konton i en organisationskatalog , det vill s. v.s. i multitenantläge. Du måste ändra det här exemplet så att det fungerar med ett personligt Microsoft-konto. Om du inte har skapat ett användarkonto i din Microsoft Entra-ID-klientorganisation ännu bör du göra det innan du fortsätter. Mer information finns i Skapa, bjuda in och ta bort användare.
- Ett personligt Microsoft-konto – till exempel Xbox, Hotmail, Live och så vidare – om du vill arbeta med personliga Microsoft-konton.
Rekommendationer
- Viss kunskap om Java/Jakarta Servlets.
- Viss kunskap om Linux/OSX-terminalen.
- jwt.ms för att inspektera dina token.
- Fiddler för övervakning av nätverksaktivitet och felsökning.
- Följ Microsoft Entra ID-bloggen för att hålla dig uppdaterad med den senaste utvecklingen.
Konfigurera exemplet
I följande avsnitt visas hur du konfigurerar exempelprogrammet.
Klona eller ladda ned exempellagringsplatsen
Om du vill klona exemplet öppnar du ett Bash-fönster och använder följande kommando:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/1-Authentication/sign-in
Du kan också gå till lagringsplatsen ms-identity-msal-java-samples och sedan ladda ned den som en .zip fil och extrahera den till hårddisken.
Viktigt!
För att undvika begränsningar för filsökvägslängd i Windows klonar eller extraherar du lagringsplatsen till en katalog nära hårddiskens rot.
Registrera exempelprogrammet med din Microsoft Entra ID-klientorganisation
Det finns ett projekt i det här exemplet. Det här avsnittet visar hur du registrerar appen.
Registrera först appen i Azure Portal genom att följa anvisningarna i Snabbstart: Registrera ett program med Microsofts identitetsplattform.
Använd sedan följande steg för att slutföra registreringen:
Gå till sidan Microsofts identitetsplattform för utvecklare Appregistreringar.
Välj Ny registrering.
På sidan Registrera ett program som visas anger du följande programregistreringsinformation:
I avsnittet Namn anger du ett beskrivande programnamn för visning för användare av appen , till exempel
java-servlet-webapp-authentication
.Under Kontotyper som stöds väljer du något av följande alternativ:
- Välj Endast Konton i den här organisationskatalogen om du skapar ett program som endast ska användas av användare i din klientorganisation, det vill s.v.s. ett program med en enda klientorganisation .
- Välj Konton i en organisationskatalog om du vill att användare i en Microsoft Entra-ID-klientorganisation ska kunna använda ditt program , det vill s.v.s. ett program med flera klienter.
- Välj Konton i en organisationskatalog och personliga Microsoft-konton för den bredaste uppsättningen kunder , det vill: ett program med flera klientorganisationer som också stöder Microsofts personliga konton.
- Välj Personliga Microsoft-konton som endast ska användas av användare av personliga Microsoft-konton – till exempel Hotmail-, Live-, Skype- och Xbox-konton.
I avsnittet Omdirigerings-URI väljer du Webb i kombinationsrutan och anger följande omdirigerings-URI:
http://localhost:8080/msal4j-servlet-auth/auth/redirect
.
Välj Registrera för att skapa programmet.
På appens registreringssida letar du upp och kopierar värdet program-ID (klient) för senare användning. Du använder det här värdet i appens konfigurationsfil eller filer.
På appens registreringssida väljer du Certifikat och hemligheter i navigeringsfönstret för att öppna sidan för att generera hemligheter och ladda upp certifikat.
Under avsnittet Klienthemlighet välj Ny klienthemlighet.
Skriv en beskrivning – till exempel apphemlighet.
Välj en av de tillgängliga varaktigheterna: Om ett år, Om två år eller Aldrig upphör att gälla.
Markera Lägga till. Det genererade värdet visas.
Kopiera och spara det genererade värdet för användning i senare steg. Du behöver det här värdet för kodens konfigurationsfiler. Det här värdet visas inte igen och du kan inte hämta det på något annat sätt. Se därför till att spara den från Azure Portal innan du går till någon annan skärm eller ett annat fönster.
Konfigurera appen så att den använder din appregistrering
Använd följande steg för att konfigurera appen:
Kommentar
I följande steg ClientID
är samma som Application ID
eller AppId
.
Öppna projektet i din IDE.
Öppna filen ./src/main/resources/authentication.properties.
Leta reda på strängen
{enter-your-tenant-id-here}
. Ersätt det befintliga värdet med något av följande värden:- Ditt Klient-ID för Microsoft Entra om du har registrerat din app med alternativet Endast konton i den här organisationskatalogen .
organizations
Ordet om du har registrerat din app med alternativet Konton i en organisationskatalog.common
Ordet om du har registrerat din app med alternativet Konton i en organisationskatalog och personliga Microsoft-konton.- Ordet
consumers
om du har registrerat din app med alternativet Personliga Microsoft-konton .
Leta upp strängen
{enter-your-client-id-here}
och ersätt det befintliga värdet med program-ID:t ellerclientId
programmetjava-servlet-webapp-authentication
som kopierats från Azure Portal.Leta reda på strängen
{enter-your-client-secret-here}
och ersätt det befintliga värdet med det värde som du sparade när appen skapadesjava-servlet-webapp-authentication
i Azure Portal.
Skapa exemplet
Om du vill skapa exemplet med Maven går du till katalogen som innehåller pom.xml-filen för exemplet och kör sedan följande kommando:
mvn clean package
Det här kommandot genererar en .war-fil som du kan köra på olika programservrar.
Kör exemplet
Följande avsnitt visar hur du distribuerar exemplet till Azure App Service.
Förutsättningar
Maven-plugin-program för Azure App Service-appar
Om Maven inte är det utvecklingsverktyg du föredrar kan du läsa följande liknande självstudier som använder andra verktyg:
Konfigurera Maven-plugin-programmet
När du distribuerar till Azure App Service använder distributionen automatiskt dina Azure-autentiseringsuppgifter från Azure CLI. Om Azure CLI inte installeras lokalt autentiseras Maven-plugin-programmet med OAuth eller enhetsinloggning. Mer information finns i autentisering med Maven-plugin-program.
Använd följande steg för att konfigurera plugin-programmet:
Kör följande kommando för att konfigurera distributionen. Det här kommandot hjälper dig att konfigurera Azure App Service-operativsystemet, Java-versionen och Tomcat-versionen.
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:config
Tryck på Y för Skapa ny körningskonfiguration och tryck sedan på Retur.
För Definiera värde för operativsystem trycker du på 1 för Windows eller 2 för Linux och trycker sedan på Retur.
För Definiera värde för javaVersion trycker du på 2 för Java 11 och trycker sedan på Retur.
För Definiera värde för webContainer trycker du på 4 för Tomcat 9.0 och trycker sedan på Retur.
För Definiera värde för pricingTier trycker du på Retur för att välja standardnivån P1v2 .
Tryck på Y för Bekräfta och tryck sedan på Retur.
I följande exempel visas utdata från distributionsprocessen:
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] ------------------------------------------------------------------------
När du har bekräftat dina val lägger plugin-programmet till det nödvändiga plugin-elementet och inställningarna i projektets pom.xml-fil för att konfigurera appen så att den körs i Azure App Service.
Den relevanta delen av pom.xml-filen bör se ut ungefär som i följande exempel:
<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>
Du kan ändra konfigurationerna för App Service direkt i pom.xml. Några vanliga konfigurationer visas i följande tabell:
Property | Obligatoriskt | Beskrivning |
---|---|---|
subscriptionId |
falskt | Prenumerations-ID:t. |
resourceGroup |
true | Azure-resursgruppen för din app. |
appName |
true | Namnet på din app. |
region |
falskt | Den region där appen ska vara värd. Standardvärdet är centralus . Giltiga regioner finns i Regioner som stöds. |
pricingTier |
falskt | Prisnivån för din app. Standardvärdet är P1v2 för en produktionsarbetsbelastning. Det rekommenderade minimivärdet för Java-utveckling och -testning är B2 . Mer information finns i Prissättning för App Service. |
runtime |
falskt | Konfigurationen av körningsmiljön. Mer information finns i Konfigurationsinformation. |
deployment |
falskt | Distributionskonfigurationen. Mer information finns i Konfigurationsinformation. |
En fullständig lista över konfigurationer finns i referensdokumentationen för plugin-programmet. Alla Azure Maven-plugin-program delar en gemensam uppsättning konfigurationer. De här konfigurationerna finns i Vanliga konfigurationer. Konfigurationer som är specifika för Azure App Service finns i Azure-app: Konfigurationsinformation.
Se till att spara värdena appName
och resourceGroup
för senare användning.
Förbereda appen för distribution
När du distribuerar programmet till App Service ändras omdirigerings-URL:en till omdirigerings-URL:en för din distribuerade appinstans. Använd följande steg för att ändra de här inställningarna i egenskapsfilen:
Navigera till appens authentication.properties-fil och ändra värdet
app.homePage
för till den distribuerade appens domännamn, som du ser i följande exempel. Om du till exempel valdeexample-domain
för ditt appnamn i föregående steg måste du nu användahttps://example-domain.azurewebsites.net
förapp.homePage
värdet. Se till att du också har ändrat protokollet frånhttp
tillhttps
.# 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
När du har sparat den här filen använder du följande kommando för att återskapa din app:
mvn clean package
Viktigt!
I samma authentication.properties-fil har du en inställning för din aad.secret
. Det är inte bra att distribuera det här värdet till App Service. Det är inte heller en bra idé att lämna det här värdet i koden och eventuellt push-överföra det till git-lagringsplatsen. Om du vill ta bort det här hemliga värdet från koden hittar du mer detaljerad vägledning i avsnittet Distribuera till App Service – Ta bort hemlighet . Den här vägledningen lägger till extra steg för att push-överföra det hemliga värdet till Key Vault och för att använda Key Vault-referenser.
Uppdatera din Microsoft Entra ID-appregistrering
Eftersom omdirigerings-URI:n ändras till din distribuerade app till Azure App Service måste du också ändra omdirigerings-URI:n i din Microsoft Entra ID-appregistrering. Gör den här ändringen med hjälp av följande steg:
Gå till sidan Microsofts identitetsplattform för utvecklare Appregistreringar.
Använd sökrutan för att söka efter din appregistrering – till exempel
java-servlet-webapp-authentication
.Öppna appregistreringen genom att välja dess namn.
Markera Autentisering på kommandomenyn.
I avsnittet Omdirigerings-URI:er för webben - väljer du Lägg till URI.
Fyll i URI:n för din app och lägg till
/auth/redirect
– till exempelhttps://<your-app-name>.azurewebsites.net/auth/redirect
.Välj Spara.
Distribuera appen
Nu är du redo att distribuera din app till Azure App Service. Använd följande kommando för att se till att du är inloggad i Azure-miljön för att köra distributionen:
az login
Med all konfiguration klar i din pom.xml-fil kan du nu använda följande kommando för att distribuera din Java-app till Azure:
mvn package azure-webapp:deploy
När distributionen är klar är programmet redo på http://<your-app-name>.azurewebsites.net/
. Öppna URL:en med din lokala webbläsare, där du bör se programmets msal4j-servlet-auth
startsida.
Utforska exemplet
Använd följande steg för att utforska exemplet:
- Observera den inloggade eller utloggade statusen som visas i mitten av skärmen.
- Välj den sammanhangskänsliga knappen i hörnet. Den här knappen läser Logga in när du först kör appen.
- På nästa sida följer du anvisningarna och loggar in med ett konto i Microsoft Entra ID-klientorganisationen.
- Observera de omfång som begärs på medgivandeskärmen.
- Observera att den sammanhangskänsliga knappen nu säger Logga ut och visar ditt användarnamn.
- Välj ID-tokeninformation för att se några av ID-tokens avkodade anspråk.
- Använd knappen i hörnet för att logga ut.
- När du har loggat ut väljer du ID-tokeninformation för att observera att appen visar ett
401: unauthorized
fel i stället för ID-tokenanspråken när användaren inte har behörighet.
Om koden
Det här exemplet visar hur du använder MSAL för Java (MSAL4J) för att logga in användare i din Microsoft Entra ID-klientorganisation. Om du vill använda MSAL4J i dina egna program måste du lägga till det i dina projekt med Maven.
Om du vill replikera det här exemplets beteende kan du kopiera pom.xml-filen och innehållet i hjälpmapparna och authservlets-mapparna i mappen src/main/java/com/microsoft/azuresamples/msal4j. Du behöver också filen authentication.properties . Dessa klasser och filer innehåller allmän kod som du kan använda i en mängd olika program. Du kan också kopiera resten av exemplet, men de andra klasserna och filerna skapas specifikt för att hantera det här exemplets mål.
Innehåll
I följande tabell visas innehållet i exempelprojektmappen:
Fil/mapp | beskrivning |
---|---|
src/main/java/com/microsoft/azuresamples/msal4j/authwebapp/ | Den här katalogen innehåller de klasser som definierar appens affärslogik för serverdelen. |
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ | Den här katalogen innehåller de klasser som används för inloggning och utloggningsslutpunkter. |
____Servlet.java | Alla tillgängliga slutpunkter definieras i .java klasser som slutar i ____Servlet.java. |
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ | Hjälpklasser för autentisering. |
AuthenticationFilter.java | Omdirigerar oautentiserade begäranden till skyddade slutpunkter till en 401-sida. |
src/main/resources/authentication.properties | Microsoft Entra-ID och programkonfiguration. |
src/main/webapp/ | Den här katalogen innehåller användargränssnittet – JSP-mallar |
CHANGELOG.md | Lista över ändringar i exemplet. |
CONTRIBUTING.md | Riktlinjer för att bidra till exemplet. |
LICENS | Licensen för exemplet. |
ConfidentialClientApplication
En ConfidentialClientApplication
instans skapas i AuthHelper.java-filen, som du ser i följande exempel. Det här objektet hjälper till att skapa Auktoriserings-URL:en för Microsoft Entra-ID och hjälper även till att byta ut autentiseringstoken mot en åtkomsttoken.
// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
.builder(CLIENT_ID, secret)
.authority(AUTHORITY)
.build();
Följande parametrar används för instansiering:
- Appens klient-ID.
- Klienthemligheten, som är ett krav för konfidentiella klientprogram.
- Microsoft Entra ID-utfärdare, som innehåller ditt Klient-ID för Microsoft Entra.
I det här exemplet läss dessa värden från filen authentication.properties med hjälp av en egenskapsläsare i filen Config.java .
Stegvis genomgång
Följande steg innehåller en genomgång av appens funktioner:
Det första steget i inloggningsprocessen är att skicka en begäran till
/authorize
slutpunkten på för din Microsoft Entra-ID-klientorganisation. MSAL4J-instansenConfidentialClientApplication
används för att skapa en URL för auktoriseringsbegäran. Appen omdirigerar webbläsaren till den här URL:en, där användaren loggar in.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);
I följande lista beskrivs funktionerna i den här koden:
AuthorizationRequestUrlParameters
: Parametrar som måste anges för att skapa en AuthorizationRequestUrl.REDIRECT_URI
: När Microsoft Entra ID omdirigerar webbläsaren – tillsammans med autentiseringskoden – efter att användarens autentiseringsuppgifter har samlats in. Den måste matcha omdirigerings-URI:n i Microsoft Entra ID-appregistreringen i Azure Portal.SCOPES
: Omfång är behörigheter som begärs av programmet. Normalt räcker det med de tre omfångenopenid profile offline_access
för att ta emot ett ID-tokensvar.Du hittar en fullständig lista över omfång som begärs av appen i filen authentication.properties . Du kan lägga till fler omfång, till exempel
User.Read
.
Användaren får en inloggningsprompt av Microsoft Entra-ID. Om inloggningsförsöket lyckas omdirigeras användarens webbläsare till appens omdirigeringsslutpunkt. En giltig begäran till den här slutpunkten innehåller en auktoriseringskod.
Instansen
ConfidentialClientApplication
utbyter sedan den här auktoriseringskoden mot en ID-token och åtkomsttoken från 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();
I följande lista beskrivs funktionerna i den här koden:
AuthorizationCodeParameters
: Parametrar som måste anges för att kunna byta auktoriseringskoden mot ett ID och/eller en åtkomsttoken.authCode
: Auktoriseringskoden som togs emot vid omdirigeringsslutpunkten.REDIRECT_URI
: Omdirigerings-URI:n som användes i föregående steg måste skickas igen.SCOPES
: Omfången som användes i föregående steg måste skickas igen.
Om
acquireToken
det lyckas extraheras tokenanspråken. Om nonce-kontrollen godkänns placeras resultatet icontext
– en instans avIdentityContextData
– och sparas i sessionen. Programmet kan sedan instansieraIdentityContextData
från sessionen genom en instans avIdentityContextAdapterServlet
när det behöver åtkomst till den, som visas i följande kod:// 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());
Skydda vägarna
Information om hur exempelappen filtrerar åtkomst till vägar finns i AuthenticationFilter.java. I filen app.protect.authenticated
authentication.properties innehåller egenskapen de kommaavgränsade vägar som endast autentiserade användare kan komma åt, enligt följande exempel:
# for example, /token_details requires any user to be signed in and does not require special roles claim(s)
app.protect.authenticated=/token_details
Omfattningar
Omfång anger för Microsoft Entra-ID vilken åtkomstnivå programmet begär.
Baserat på de begärda omfången presenterar Microsoft Entra-ID en medgivandedialog för användaren vid inloggning. Om användaren samtycker till ett eller flera omfång och hämtar en token kodas scopes-consented-to till i den resulterande access_token
.
De omfång som begärs av programmet finns i authentication.properties. Dessa tre omfång begärs av MSAL och anges av Microsoft Entra-ID som standard.
Mer information
- Microsoft Authentication Library (MSAL) för Java
- Referensdokumentation för MSAL Java
- Microsofts identitetsplattform (Microsoft Entra-ID för utvecklare)
- Snabbstart: Registrera ett program med Microsofts identitetsplattform
- Förstå funktioner för medgivande för Microsoft Entra-ID-program
- Förstå användar- och administratörsmedgivande
- MSAL-kodexempel