Dela via


Skydda Java Spring Boot-appar med Azure Active Directory B2C

Den här artikeln visar en Java Spring Boot-webbapp som loggar in användare på din Azure Active Directory B2C-klientorganisation med hjälp av Azure AD B2C Spring Boot Starter-klientbiblioteket för Java. Det använder OpenID Connect-protokollet.

Följande diagram visar appens topologi:

Diagram that shows the topology of the app.Diagram som visar appens topologi.

Klientappen använder Azure AD B2C Spring Boot Starter-klientbiblioteket för Java för att logga in en användare och hämta en ID-token från Azure AD B2C. ID-token bevisar att användaren autentiseras med Azure AD B2C och gör det möjligt för användaren att komma åt skyddade vägar.

Förutsättningar

Rekommendationer

  • Viss kunskap om Spring Framework.
  • 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-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 4-spring-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.

Det här exemplet levereras med ett förregistrerat program i demosyfte. Om du vill använda en egen Azure AD B2C-klientorganisation och ett program registrerar du och konfigurerar programmet i Azure Portal. Mer information finns i avsnittet Registrera appen . Annars fortsätter du med stegen i avsnittet Kör exemplet .

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

Använd följande steg för att välja klientorganisation:

  1. Logga in på Azure-portalen.

  2. Om ditt konto finns i mer än en Azure AD B2C-klientorganisation väljer du din profil i hörnet av Azure Portal och väljer sedan Växla katalog för att ändra sessionen till önskad Azure AD B2C-klientorganisation.

Skapa användarflöden och anpassade principer

Information om hur du skapar vanliga användarflöden som registrering, inloggning, profilredigering och lösenordsåterställning finns i Självstudie: Skapa användarflöden i Azure Active Directory B2C.

Du bör även överväga att skapa anpassade principer i Azure Active Directory B2C. Den här uppgiften ligger dock utanför omfånget för den här självstudien. Mer information finns i Översikt över anpassad princip i Azure AD B2C.

Lägga till externa identitetsprovidrar

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

Registrera appen (java-spring-webapp-auth-b2c)

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

  1. Gå till Azure Portal 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 programregistreringsinformation:

    • I avsnittet Namn anger du ett beskrivande programnamn för visning för användare av appen , till exempel java-spring-webapp-auth-b2c.
    • Under Kontotyper som stöds, välj Konton i valfri identitetsleverantör eller organisationskatalog (för autentisering av användare med användarflöden).
    • I avsnittet Omdirigerings-URI (valfritt) väljer du Webb i kombinationsrutan och anger följande omdirigerings-URI: http://localhost:8080/login/oauth2/code/.
  4. Välj Registrera för att skapa programmet.

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

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

  7. På appens registreringssida väljer du fönstret Certifikat och hemligheter i navigeringsfönstret för att öppna sidan för att 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 av de tillgängliga varaktigheterna enligt dina säkerhetsproblem , till exempel Om två år.

  11. Markera Lägga 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 (java-spring-webapp-auth-b2c) för att använda 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.

  1. Öppna projektet i din IDE.

  2. Öppna filen src/main/resources/application.yml.

  3. Leta upp client-id egenskapen och ersätt det befintliga värdet med program-ID:t eller java-spring-webapp-auth-b2cclientId programmet från Azure Portal.

  4. Leta upp client-secret egenskapen och ersätt det befintliga värdet med det värde som du sparade när programmet skapades java-spring-webapp-auth-b2c från Azure Portal.

  5. Leta upp base-uri egenskapen och ersätt de två instanserna av värdet fabrikamb2c med namnet på Azure AD B2C-klientorganisationen där du skapade java-spring-webapp-auth-b2c programmet i Azure Portal.

  6. sign-up-or-sign-in Leta upp egenskapen och ersätt den med namnet på registrerings-/inloggningsprincipen för användarflöde som du skapade i Azure AD B2C-klientorganisationen där du skapade java-spring-webapp-auth-b2c programmet i Azure Portal.

  7. Leta upp profile-edit egenskapen och ersätt den med namnet på principen för lösenordsåterställning av användarflöde som du skapade i Azure AD B2C-klientorganisationen där du skapade java-spring-webapp-auth-b2c programmet i Azure Portal.

  8. Leta upp password-reset egenskapen och ersätt den med namnet på användarflödesprincipen för redigeringsprofilen som du skapade i Azure AD B2C-klientorganisationen där du skapade java-spring-webapp-auth-b2c programmet i Azure Portal.

  9. Öppna filen src/main/resources/templates/navbar.html .

  10. Hitta referenserna b2c_1_susi till och b2c_1_edit_profile -flödena och ersätt dem med dina sign-up-sign-in och profile-edit användarflödena.

Kör exemplet

Följande avsnitt visar hur du distribuerar exemplet till Azure Container Apps.

Förutsättningar

Förbereda Spring-projektet

Använd följande steg för att förbereda projektet:

  1. Använd följande Maven-kommando för att skapa projektet:

    mvn clean verify
    
  2. Kör exempelprojektet lokalt med hjälp av följande kommando:

    mvn spring-boot:run
    

Ställ in

Om du vill logga in på Azure från CLI kör du följande kommando och följer anvisningarna för att slutföra autentiseringsprocessen.

az login

Kör uppgraderingskommandot för att säkerställa att du kör den senaste versionen av CLI.

az upgrade

Installera eller uppdatera sedan Azure Container Apps-tillägget för CLI.

Om du får fel om saknade parametrar när du kör az containerapp kommandon i Azure CLI kontrollerar du att den senaste versionen av Azure Container Apps-tillägget är installerad.

az extension add --name containerapp --upgrade

Kommentar

Från och med maj 2024 aktiverar Azure CLI-tillägg inte längre förhandsversionsfunktioner som standard. Om du vill komma åt förhandsversionsfunktioner för Container Apps installerar du containerapptillägget med --allow-preview true.

az extension add --name containerapp --upgrade --allow-preview true

Nu när det aktuella tillägget eller modulen har installerats registrerar du Microsoft.App namnrymderna och Microsoft.OperationalInsights .

Kommentar

Azure Container Apps-resurser har migrerats från Microsoft.Web namnområdet till Microsoft.App namnområdet. Mer information finns i Namnområdesmigrering från Microsoft.Web till Microsoft.App i mars 2022.

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

Skapa Azure Container Apps-miljön

Nu när azure CLI-installationen är klar kan du definiera de miljövariabler som används i hela den här artikeln.

Definiera följande variabler i bash-gränssnittet.

export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"

Skapa en resursgrupp.

az group create  \
    --name $RESOURCE_GROUP \
    --location $LOCATION \

Skapa en miljö med en automatiskt genererad Log Analytics-arbetsyta.

az containerapp env create \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION

Visa standarddomänen för containerappmiljön. Anteckna den här domänen som ska användas i senare avsnitt.

az containerapp env show \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --query properties.defaultDomain

Förbereda appen för distribution

När du distribuerar ditt program till Azure Container Apps ändras omdirigerings-URL:en till omdirigerings-URL:en för din distribuerade appinstans i Azure Container Apps. Använd följande steg för att ändra de här inställningarna i din application.yml-fil :

  1. Gå till appens src\main\resources\application.yml-fil och ändra värdet post-logout-redirect-uri för till den distribuerade appens domännamn, som du ser i följande exempel. Se till att ersätta <API_NAME> och <default-domain-of-container-app-environment> med dina faktiska värden. Med standarddomänen för din Azure Container App-miljö från föregående steg och ms-identity-api för ditt appnamn använder https://ms-identity-api.<default-domain> du till exempel värdet post-logout-redirect-uri .

    post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
    
  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!

Den application.yml filen för programmet innehåller för närvarande värdet för din klienthemlighet i parametern client-secret . Det är inte bra att behålla det här värdet i den här filen. Du kan också ta en risk om du checkar in filen på en Git-lagringsplats. Den rekommenderade metoden finns i Hantera hemligheter i Azure Container Apps.

Uppdatera din Microsoft Entra ID-appregistrering

Eftersom omdirigerings-URI:n ändras till din distribuerade app i Azure Container Apps 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 Microsofts identitetsplattform för utvecklare Appregistreringar.

  2. Använd sökrutan för att söka efter din appregistrering – till exempel java-servlet-webapp-authentication.

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

  4. Markera Autentisering på kommandomenyn.

  5. I avsnittet Omdirigerings-URI:er för webben - väljer du Lägg till URI.

  6. Fyll i URI:n för din app och lägg till /login/oauth2/code/ – till exempel https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/.

  7. Välj Spara.

Distribuera appen

Distribuera JAR-paketet till Azure Container Apps.

Kommentar

Om det behövs kan du ange JDK-versionen i Miljövariablerna för Java-kompilering. Mer information finns i Skapa miljövariabler för Java i Azure Container Apps.

Nu kan du distribuera WAR-filen med az containerapp up CLI-kommandot.

az containerapp up \
    --name $API_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --environment $ENVIRONMENT \
    --artifact <JAR_FILE_PATH_AND_NAME> \
    --ingress external \
    --target-port 8080 \
    --query properties.configuration.ingress.fqdn

Kommentar

JDK-standardversionen är 17. Om du behöver ändra JDK-versionen för kompatibilitet med ditt program kan du använda --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION> argumentet för att justera versionsnumret.

Mer information om hur du skapar miljövariabler finns i Skapa miljövariabler för Java i Azure Container Apps.

Verifiera appen

I det här exemplet containerapp up innehåller --query properties.configuration.ingress.fqdn kommandot argumentet, som returnerar det fullständigt kvalificerade domännamnet (FQDN), även kallat appens URL. Använd följande steg för att kontrollera appens loggar för att undersöka eventuella distributionsproblem:

  1. Öppna url:en för utdataprogrammet från sidan Utdata i avsnittet Distribution .

  2. I navigeringsfönstret på sidan Översikt över Azure Container Apps-instansen väljer du Loggar för att kontrollera appens loggar.

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. Du kan också välja länken till tokeninformation. Eftersom den här sidan är skyddad och kräver autentisering omdirigeras du automatiskt till inloggningssidan.
  3. På nästa sida följer du anvisningarna och loggar in med ett konto för din valda identitetsprovider. Du kan också välja att registrera dig eller logga in på ett lokalt konto i B2C-klienten med hjälp av en e-postadress.
  4. När inloggningsflödet har slutförts bör du omdirigeras till startsidan – som visar inloggningsstatusen – eller sidan med tokeninformation, beroende på vilken knapp som utlöste inloggningsflödet.
  5. Observera att den sammanhangskänsliga knappen nu säger Logga ut och visar ditt användarnamn.
  6. Om du är på startsidan väljer du ID-tokeninformation för att se några av ID-tokens avkodade anspråk.
  7. Redigera din profil. Välj redigera profil för att ändra information som visningsnamn, bostadsort och yrke.
  8. Använd knappen i hörnet för att logga ut. Statussidan visar det nya tillståndet.

Om koden

Det här exemplet visar hur du använder Azure AD B2C Spring Boot Starter-klientbiblioteket för Java för att logga in användare i din Azure AD B2C-klientorganisation. Exemplet använder även Spring Oauth2-klienten och Spring Web-startstartarna. Exemplet använder anspråk från den ID-token som hämtats från Azure AD B2C för att visa information om den inloggade användaren.

Innehåll

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

Fil/mapp beskrivning
pom.xml Programberoenden.
src/main/resources/templates/ Thymeleaf-mallar för användargränssnittet.
src/main/resources/application.yml Program- och Microsoft Entra Boot Starter-bibliotekskonfiguration.
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ Den här katalogen innehåller huvudprogrammets startpunkt, styrenhet och konfigurationsklasser.
.../MsIdentitySpringBootWebappApplication.java Huvudklass.
.../SampleController.java Styrenhet med slutpunktsmappningar.
.../SecurityConfig.java Säkerhetskonfiguration – till exempel vilka vägar som kräver autentisering.
.../Utilities.java Verktygsklass – till exempel filter-ID-tokenanspråk.
CHANGELOG.md Lista över ändringar i exemplet.
CONTRIBUTING.md Riktlinjer för att bidra till exemplet.
LICENS Licensen för exemplet.

ID-tokenanspråk

För att extrahera tokeninformation använder appen Spring Securitys AuthenticationPrincipal och OidcUser objektet i en begärandemappning, som du ser i följande exempel, som du ser i följande exempel. Se Exempelkontrollanten för fullständig information om hur den här appen använder ID-tokenanspråk.

import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
    Map<String, Object> claims = principal.getIdToken().getClaims();
}

För inloggning skickar appen en begäran till Azure AD B2C-inloggningsslutpunkten automatiskt konfigurerad av Azure AD B2C Spring Boot Starter-klientbiblioteket för Java, som du ser i följande exempel:

<a class="btn btn-success" href="/oauth2/authorization/{your-sign-up-sign-in-user-flow}">Sign In</a>

För utloggning gör appen en POST-begäran till logout slutpunkten, som du ser i följande exempel:

<form action="#" th:action="@{/logout}" method="post">
  <input class="btn btn-warning" type="submit" value="Sign Out" />
</form>

Autentiseringsberoende gränssnittselement

Appen har lite enkel logik på mallsidorna för användargränssnittet för att bestämma innehåll som ska visas baserat på om användaren autentiseras, som du ser i följande exempel med Hjälp av Spring Security Thymeleaf-taggar:

<div sec:authorize="isAuthenticated()">
  this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
  this content only shows to not-authenticated users
</div>

Skydda vägar med WebSecurityConfigurerAdapter

Som standard skyddar appen sidan Information om ID-token så att endast inloggade användare kan komma åt den. Appen konfigurerar dessa vägar från app.protect.authenticated egenskapen från filen application.yml . Om du vill konfigurera appens specifika krav kan du utöka WebSecurityConfigurerAdapter i någon av dina klasser. Ett exempel finns i den här appens SecurityConfig-klass , som visas i följande kod:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${app.protect.authenticated}")
    private String[] protectedRoutes;

    private final AADB2COidcLoginConfigurer configurer;

    public SecurityConfig(AADB2COidcLoginConfigurer configurer) {
        this.configurer = configurer;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeRequests()
            .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details)
            .antMatchers("/**").permitAll()                  // allow all other routes.
            .and()
            .apply(configurer)
            ;
        // @formatter:off
    }
}

Mer information

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