Aktivera inloggning för Java Tomcat-appar med MSAL4J med Azure Active Directory B2C

Den här artikeln demonstrerar en Java Tomcat-applikation som autentiserar användare mot Azure Active Directory B2C (Azure AD B2C) med hjälp av Microsoft Authentication Library for Java (MSAL4J).

Kommentar

Från och med den 1 maj 2025 är Azure Active Directory B2C inte längre tillgängligt att köpa för nya kunder. Befintliga kunder kan fortsätta att använda Azure AD B2C, med support som tillhandahålls till åtminstone maj 2030. För nya projekt för kundidentitet och åtkomsthantering (CIAM) använder du Microsoft Entra External ID i stället.

Följande diagram visar appens topologi:

Diagram som visar appens topologi.

Appen använder MSAL4J för att logga in användare och hämta en ID-token från Azure AD B2C. ID-token bevisar att användaren autentiseras mot en Azure AD B2C-klientorganisation.

Förutsättningar

  • JDK version 8 eller senare
  • Maven 3
  • En Azure AD B2C-klientorganisation. Mer information finns i Självstudie: Skapa en Azure Active Directory B2C-klientorganisation
  • Ett användarkonto i din Azure AD B2C-klientorganisation.
  • Tomcat 9
  • Visual Studio Code
  • Azure Tools för Visual Studio Code

Rekommendationer

  • Viss kännedom om Java / Jakarta Servlets.
  • Viss kunskap om Linux/OSX-terminalen.
  • jwt.ms för att granska dina token.
  • Fiddler för att övervaka nätverksaktivitet och felsöka.
  • Följ Microsoft Entra-bloggen för att hålla dig up-to-date 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-b2c

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 exempelappen med din Azure AD B2C-klientorganisation

Exemplet levereras med ett förregistrerat program i testsyfte. Om du vill använda din egen Azure AD B2C-klientorganisation och din egen applikation kan du följa stegen i följande avsnitt för att registrera och konfigurera applikationen i Azure-portalen. Annars fortsätt med stegen för Kör exemplet.

Välj den Azure AD B2C-klientorganisation där du vill skapa dina program

Så här väljer du din klientorganisation:

  1. Logga in i Azure-portalen.

  2. Om ditt konto finns i mer än en Azure AD B2C-klientorganisation väljer du din profil i hörnet i Azure-portalen och väljer sedan Växla katalog för att byta session till den önskade Azure AD B2C-klientorganisationen.

Skapa användarflöden och anpassade principer

Om du vill skapa vanliga användarflöden som registrering, inloggning, profilredigering och lösenordsåterställning kan du läsa självstudien Skapa användarflöden i Azure Active Directory B2C.

Du bör även överväga att skapa anpassade principer i Azure Active Directory B2C, men detta ligger utanför ramen för den här självstudien.

Lägga till externa identitetsprovidrar

Se Självstudie: Lägga till identitetsleverantörer i dina program i Azure Active Directory B2C.

Registrera appen (ms-identity-b2c-java-servlet-webapp-authentication)

Använd följande steg för att registrera appen:

  1. Gå till Azure-portalen och välj Azure AD B2C.

  2. Välj Appregistreringar i navigeringsfönstret och välj sedan Ny registrering.

  3. På sidan Registrera ett program som visas anger du följande information för programregistreringen:

    • I avsnittet Namn anger du ett beskrivande appnamn som visas för appens användare - till exempel .
    • Under Kontotyper som stöds väljer du Konton i valfri organisationskatalog och personliga Microsoft-konton (t.ex. Skype, Xbox Outlook.com).
    • I avsnittet Omdirigerings-URI (valfritt) väljer du Web i kombinationsrutan och anger följande omdirigerings-URI: .
  4. Välj Registrera för att skapa programmet.

  5. På appens registreringssida letar du reda på och kopierar värdet för Program-ID (klient) som du ska använda senare. Du använder det här värdet i appens konfigurationsfil eller filer.

  6. Välj Spara för att spara dina ändringar.

  7. På appens registreringssida väljer du Certifikat och hemligheter i navigeringsfönstret för att öppna sidan där du kan generera hemligheter och ladda upp certifikat.

  8. Under avsnittet Klienthemlighet välj Ny klienthemlighet.

  9. Skriv en beskrivning – till exempel apphemlighet.

  10. Välj en förfallotid för hemligheten eller ange en anpassad livslängd. Klienthemligheter är begränsade till en maximal livslängd på 24 månader och Microsoft rekommenderar ett utgångsdatum på mindre än 12 månader. För produktionsappar föredrar du ett certifikat eller federerade identitetsautentiseringsuppgifter framför en klienthemlighet.

  11. Välj Lägg till. Det genererade värdet visas.

  12. 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 (ms-identity-b2c-java-servlet-webapp-authentication) för att använda din appregistrering

Använd följande steg för att konfigurera appen:

Kommentar

I följande steg är samma som eller .

  1. Öppna projektet i din IDE.

  2. Öppna filen ./src/main/resources/authentication.properties.

  3. Leta upp egenskapen och ersätt det befintliga värdet med program-ID:t eller för programmet från Azure-portalen.

  4. Leta upp egenskapen och ersätt det befintliga värdet med det värde som du sparade när du skapade programmet i Azure-portalen.

  5. Leta upp egenskapen och ersätt det befintliga klient-ID:t för programmet med det värde som du angav i i steg 1 i det här avsnittet.

  6. Leta upp egenskapen och ersätt den första instansen av med namnet på den Azure AD B2C-klientorganisation där du skapade programmet i Azure-portalen.

  7. Hitta egenskapen och ersätt den andra förekomsten av med namnet på den Azure AD B2C-klientorganisation där du skapade programmet i Azure-portalen.

  8. Leta upp egenskapen och ersätt den med namnet på användarflödesprincipen för registrering/inloggning som du skapade i den Azure AD B2C-klientorganisation där du skapade programmet i Azure-portalen.

  9. Leta reda på egenskapen och ersätt den med namnet på användarflödesprincipen för lösenordsåterställning som du skapade i den Azure AD B2C-klientorganisation där du skapade programmet i Azure-portalen.

  10. Leta upp egenskapen och ersätt den med namnet på den användarflödesprincip för redigering av profil som du skapade i den Azure AD B2C-klientorganisation där du skapade programmet i Azure-portalen.

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

  • Distribuera till Azure App Service
  • Kör lokalt

Följande avsnitt visar hur du distribuerar exemplet till Azure App Service.

Förutsättningar

  • Maven-plugin 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:

    • IntelliJ IDEA
    • Eclipse
    • Visual Studio Code

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-pluginer.

Använd följande steg för att konfigurera plugin-programmet:

  1. 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
    
  2. För Skapa ny körningskonfiguration, tryck på Y och tryck sedan på Retur.

  3. 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.

  4. För Ange värde för javaVersion, tryck på 2 för Java 11 och sedan på Enter.

  5. För Definiera värde för webContainer trycker du på 4 för Tomcat 9.0 och trycker sedan på Retur.

  6. För Definiera värde för pricingTier, tryck på Retur för att välja standardnivån P1v2.

  7. För att bekräfta, tryck på Y och sedan på Enter.

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:

Egenskap Obligatoriskt Beskrivning
subscriptionId falskt Prenumerations-ID.
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 . För giltiga regioner, se Regioner som stöds.
pricingTier falskt Prisnivån för din app. Standardvärdet är för en produktionsarbetslast. Det rekommenderade minimivärdet för Java-utveckling och -testning är . Mer information finns i Prissättning för App Service.
runtime falskt Konfiguration av körningsmiljön. Mer information finns i Konfigurationsdetaljer.
deployment falskt Konfigurationen för driftsättning. Mer information finns i Konfigurationsdetaljer.

En fullständig lista över konfigurationer finns i referensdokumentationen för plugin-programmet. Alla Azure Maven-plugin-program delar en gemensam uppsättning konfigurationer. Mer information om de här konfigurationerna finns i Vanliga konfigurationer. För konfigurationer som är specifika för Azure App Service, se Azure-app: Konfigurationsdetaljer.

Se till att spara värdena och 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:

  1. Navigera till appens authentication.properties-fil och ändra värdet för till den driftsatta appens domännamn, som i följande exempel. Om du till exempel valde som appens namn i föregående steg, måste du nu använda som värde för . Se till att du också har ändrat protokollet från till .

    # 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
    
  2. 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 . 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 ytterligare steg för att överföra det hemliga värdet till Key Vault och för att använda Key Vault References.

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:

  1. Gå till sidan för Microsofts identitetsplattform för utvecklare App registrations.

  2. Använd sökrutan för att hitta din appregistrering - till exempel .

  3. Öppna appregistreringen genom att välja dess namn.

  4. Markera Autentisering på kommandomenyn.

  5. I avsnittet WebbOmdirigerings-URI:er väljer du Lägg till URI.

  6. Fyll i URI:n för din app genom att lägga till – till exempel .

  7. 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 har slutförts är din applikation tillgänglig på . Öppna URL:en i den lokala webbläsaren, där du bör se startsidan för -programmet.

Utforska exemplet

Använd följande steg för att utforska exemplet:

  1. Observera den inloggade eller utloggade statusen som visas i mitten av skärmen.
  2. 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.
  3. På nästa sida följer du anvisningarna och loggar in med ett konto för din valda identitetsprovider.
  4. Observera att den sammanhangskänsliga knappen nu säger Logga ut och visar ditt användarnamn.
  5. Välj Information om ID-token om du vill se några av ID-tokenens avkodade anspråk.
  6. Du kan också redigera din profil. Välj länken för att redigera information som ditt visningsnamn, bostadsort och yrke.
  7. Använd knappen i hörnet för att logga ut.
  8. När du har loggat ut går du till följande URL för sidan med tokeninformation: . Här kan du se hur appen visar ett -fel i stället för anspråken i ID-token.

Om koden

Det här exemplet visar hur du använder MSAL4J för att logga in användare i din Azure AD B2C-klientorganisation.

Innehåll

I följande tabell visas innehållet i exempelprojektmappen:

Fil/mapp Beskrivning
AuthHelper.java Hjälpfunktioner för autentisering.
Config.java Körs vid start och konfigurerar egenskapsläsare och loggning.
authentication.properties Microsoft Entra-ID och programkonfiguration.
AuthenticationFilter.java Omdirigerar oautentiserade begäranden till skyddade resurser till en 401-sida.
MsalAuthSession Instansierad med en . Lagrar alla MSAL-relaterade sessionsattribut i sessionsattribut.
*Servlet.java Alla tillgängliga slutpunkter definieras i Java-klasser med namn som slutar Servlet..
CHANGELOG.md Lista över ändringar i exemplet.
CONTRIBUTING.md Riktlinjer för att bidra till exemplet.
LICENS Licens för exemplet.

ConfidentialClientApplication

En -instans skapas i filen AuthHelper.java, som visas i följande exempel. Det här objektet hjälper dig att skapa Azure AD B2C-auktoriserings-URL:en och hjälper även till att byta ut autentiseringstoken mot en åtkomsttoken.

IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                     .builder(CLIENT_ID, secret)
                     .b2cAuthority(AUTHORITY + policy)
                     .build();

Följande parametrar används för instansiering:

  • Appens klient-ID.
  • Klienthemligheten, som är ett krav för konfidentiella klientprogram.
  • Azure AD B2C-auktoriteten sammanfogad med lämpliga för registrering, inloggning, profilredigering eller återställning av lösenord.

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:

  1. Det första steget i inloggningsprocessen är att skicka en begäran till slutpunkten för din Azure Active Directory B2C-klientorganisation. MSAL4J-instansen används för att konstruera en auktoriserings-URL, och appen omdirigerar webbläsaren till denna URL, som visas i följande exempel:

    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);
    

    I följande lista beskrivs funktionerna i den här koden:

    • : Parametrar som måste ställas in för att bygga en AuthorizationRequestUrl.

    • : Dit Azure AD B2C omdirigerar webbläsaren – tillsammans med auktoriseringskoden – efter att användarens inloggningsuppgifter har samlats in.

    • : Omfattningar är behörigheter som begärs av programmet.

      Vanligtvis brukar de tre omfången räcka för att få ett svar med en ID-token. MSAL4J kräver dock att alla svar från Azure AD B2C även innehåller en åtkomsttoken.

      För att Azure AD B2C ska kunna dela ut en åtkomsttoken och en ID-token måste begäran innehålla ytterligare ett resursomfång. Eftersom den här appen inte kräver något externt resursomfång lägger den till ett eget klient-ID som ett fjärde omfång för att kunna ta emot en åtkomsttoken.

      Du hittar en fullständig lista över omfång som begärs av appen i filen authentication.properties .

    • : Azure AD B2C kan returnera svaret som formulärparametrar i en HTTP POST-begäran eller som parametrar i frågesträngen i en HTTP GET-begäran.

    • : Azure AD B2C bör be användaren välja det konto som autentiseringen ska göras med.

    • : En unik variabel som ställs in av appen i sessionen vid varje tokenbegäran och tas bort efter att motsvarande Azure AD B2C-omdirigeringsåteranrop har mottagits. Tillståndsvariabeln säkerställer att Azure AD B2C-begäranden till faktiskt kommer från Azure AD B2C-auktoriseringsförfrågningar som härrör från den här appen och den här sessionen, vilket förhindrar CSRF-attacker. Detta görs i filen AADRedirectServlet.java .

    • : En unik variabel som appen anger i sessionen vid varje tokenbegäran och som tas bort efter att motsvarande token har tagits emot. Den här nonce transkriberas till de resulterande token som har delats ut från Azure AD B2C, vilket säkerställer att det inte sker någon tokenreprisattack.

  2. Användaren får en inloggningsprompt av Azure Active Directory B2C. 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.

  3. -instansen utbyter sedan denna auktoriseringskod mot en ID-token och en åtkomsttoken från Azure Active Directory B2C, vilket visas i följande exempel:

    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();
    

    I följande lista beskrivs funktionerna i den här koden:

    • : Parametrar som måste anges för att kunna byta ut auktoriseringskoden mot ett ID-token och/eller en åtkomsttoken.
    • : Auktoriseringskoden som togs emot vid omdirigeringsslutpunkten.
    • : omdirigerings-URI:n som användes i föregående steg måste anges igen.
    • : De scope som användes i föregående steg måste skickas med igen.
  4. Om lyckas extraheras anspråken i token, och nonce-anspråket valideras mot noncen som lagras i sessionen, som visas i följande exempel:

    parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache);
    validateNonce(msalAuth)
    processSuccessfulAuthentication(msalAuth);
    
  5. Om noncen valideras korrekt lagras autentiseringsstatusen i en serversidesession med hjälp av metoder som tillhandahålls av -klassen, som visas i följande exempel:

    msalAuth.setAuthenticated(true);
    msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
    

Mer information

  • Vad är Azure Active Directory B2C?
  • Programtyper som kan användas i služba Active Directory B2C
  • Rekommendationer och bästa praxis för Azure Active Directory B2C
  • Azure AD B2C-session
  • Microsofts autentiseringsbibliotek (MSAL) för Java

Mer information om hur OAuth 2.0-protokoll fungerar i det här och andra scenarier finns i Autentiseringsscenarier för Microsoft Entra ID.