Lägga till inloggning med Azure Active Directory B2C i en Spring-webbapp

Den här artikeln visar hur du skapar en Java-app med inloggningsfunktioner med spring initializr med Spring Boot Starter för Microsoft Entra-ID.

I den här självstudien lär du dig att:

  • Skapa ett Java-program med hjälp av Spring Initializr
  • Konfigurera Azure Active Directory B2C
  • Skydda programmet med Spring Boot-klasser och anteckningar
  • Kompilera och testa Java-programmet

Microsoft Entra ID är Microsofts molnskalade företagsidentitetslösning. Azure Active Directory B2C kompletterar funktionsuppsättningen i Microsoft Entra-ID så att du kan hantera kund-, konsument- och medborgaråtkomst till dina B2C-program (business-to-consumer).

Förutsättningar

Viktigt!

Spring Boot version 2.5 eller senare krävs för att slutföra stegen i den här artikeln.

Skapa en app med Spring Initializr

  1. Bläddra till https://start.spring.io/.

  2. Fyll i värdena enligt den här vägledningen. Etiketterna och layouten kan skilja sig från bilden som visas här.

    • Under Projekt väljer du Maven-projekt.
    • Under Språk väljer du Java.
    • Under Spring Boot väljer du 2.7.11.
    • Under Grupp, Artefakt och Namn anger du samma värde med hjälp av en kort beskrivande sträng. Användargränssnittet kan automatiskt fylla i några av dessa fält när du skriver.
    • I fönstret Beroenden väljer du Lägg till beroenden. Använd användargränssnittet för att lägga till beroenden på Spring Web och Spring Security.

    Kommentar

    Spring Security 5.5.1, 5.4.7, 5.3.10 och 5.2.11 har släppts för att hantera följande CVE-rapport CVE-2021-22119: Denial-of-Service-attack med spring-security-oauth2-client. Om du använder den äldre versionen uppgraderar du den.

  3. Välj Generera projekt och ladda sedan ned projektet till en sökväg på den lokala datorn. Flytta den nedladdade filen till en katalog med namnet efter projektet och packa upp filen. Fillayouten bör se ut ungefär så här, med det värde som du angav för Grupp i stället yourProjectför .

    .
    ├── HELP.md
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    └── src
        ├── main
        │   ├── java
        │   │   └── yourProject
        │   │       └── yourProject
        │   │           └── YourProjectApplication.java
        │   └── resources
        │       ├── application.properties
        │       ├── static
        │       └── templates
        └── test
            └── java
                └── yourProject
                    └── yourProject
                        └── YourProjectApplicationTests.java
    

Skapa och initiera en Microsoft Entra-instans

Skapa en instans i Active Directory

  1. Logga in på https://portal.azure.com.

  2. Välj Skapa en resurs. Sök efter Azure Active Directory B2C.

    Skapa en ny Azure Active Directory B2C-instans med hjälp av Azure-portalen.

  3. Välj Skapa.

    Azure Marketplace-post för Azure Active Directory B2C.

  4. Välj Skapa ett nytt Azure AD B2C-innehavare.

    Azure Portal-alternativet för att skapa en ny Azure AD B2C-klientorganisation.

  5. För Organisationsnamn och Initialt domännamn anger du lämpliga värden och väljer sedan Skapa.

    Skärmen Skapa klientorganisation i Azure AD B2C.

  6. När Active Directory-skapandet är klart väljer du ditt konto i det övre högra hörnet, väljer Växla katalog och väljer sedan katalogen som skapats. Du omdirigeras till den nya klientorganisationens startsida. Sök sedan efter b2c och välj Azure AD B2C.

    Leta upp Azure AD B2C-tjänsten.

Lägg till en programregistrering för din Spring Boot-app

  1. I fönstret Hantera väljer du Appregistreringar och sedan Ny registrering.

    Skärmbild av Azure-portalen som visar skärmen Azure AD B2C Appregistreringar.

  2. I fältet Namn anger du appens namn och väljer sedan Registrera.

    Azure AD B2C registrerar ett ansökningsformulär.

  3. I fönstret Hantera väljer du Appregistreringar och sedan det programnamn som du skapade.

    Appregistreringar skärm med visningsnamnet valt.

  4. Välj Autentisering och sedan Lägg till en plattform och sedan Webb. Ange omdirigerings-URI:er till http://localhost:8080/login/oauth2/code/och välj sedan Konfigurera.

    Alternativ som valts för autentisering, lägg till en plattform, en webbplats.

    Konfigurera webbskärmen med fältet Omdirigerings-URI:er markerat.

Lägga till apphemligheter för din app

Välj Certifikat och hemligheter och sedan Nya klienthemligheter. Ange din hemliga beskrivning och välj sedan Lägg till. När du har skapat hemligheten väljer du kopieringsikonen bredvid det hemliga värdet för att kopiera värdet för användning senare i den här artikeln.

Lägg till en klienthemlighetsskärm.

Skärmen Certifikat och hemligheter med kopieringsknappen markerad.

Kommentar

Om du lämnar avsnittet Certifikat och hemligheter och kommer tillbaka kan du inte se det hemliga värdet. I så fall måste du skapa en annan hemlighet och kopiera den för framtida användning. Ibland kan det genererade hemliga värdet innehålla tecken som är problematiska för inkludering i application.yml-filen, till exempel omvänt snedstreck eller backtick. I så fall tar du bort hemligheten och genererar en till.

Lägg till användarflöde

  1. Gå till klientorganisationens huvudsida. I avsnittet Principer i den vänstra rutan väljer du Användarflöden och sedan Nytt användarflöde.

  2. Nu ska du lämna den här självstudien, köra en annan självstudie och gå tillbaka till den här självstudien när du är klar. Här följer några saker att tänka på när du går till den andra självstudien.

    • Börja med det steg som begär att du väljer Nytt användarflöde.
    • När den här självstudien refererar till webapp1använder du det värde som du angav för Grupp i stället.
    • När du väljer anspråk som ska returneras från flödena kontrollerar du att Visningsnamn är valt. Utan det här anspråket fungerar inte appen som skapas i den här självstudien.
    • När du uppmanas att köra användarflödena är den omdirigerings-URL som du angav tidigare inte aktiv ännu. Du kan fortfarande köra flödena, men omdirigeringen slutförs inte. Detta är förväntat.
    • När du når Nästa steg går du tillbaka till den här självstudien.

    Följ alla steg i Självstudie: Skapa användarflöden i Azure Active Directory B2C för att skapa användarflöden för "registrering och inloggning", "profilredigering" och "lösenordsåterställning".

    Azure AD B2C stöder lokala konton och sociala identitetsprovidrar. Ett exempel på hur du skapar en GitHub-identitetsprovider finns i Konfigurera registrering och inloggning med ett GitHub-konto med Azure Active Directory B2C.

Konfigurera och kompilera din app

Nu när du har skapat Azure AD B2C-instansen och vissa användarflöden ska du ansluta din Spring-app till Azure AD B2C-instansen.

  1. Från kommandoraden, cd till katalogen där du packa upp .zip fil som du laddade ned från Spring Initializr.

  2. Gå till den överordnade mappen för projektet och öppna pom.xml Maven-projektfilen i en textredigerare.

  3. Lägg till beroenden för Spring OAuth2-säkerhet i pom.xml:

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
        <version>See Below</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <version>See Below</version>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        <version>See Below</version>
    </dependency>
    

    spring-cloud-azure-starter-active-directory-b2cFör använder du den senaste tillgängliga versionen. Du kanske kan använda mvnrepository.com för att slå upp det här.

    spring-boot-starter-thymeleafFör använder du den version som motsvarar den version av Spring Boot som du valde ovan, till exempel 2.3.4.RELEASE.

    För thymeleaf-extras-springsecurity5använder du den senaste tillgängliga versionen. Du kanske kan använda mvnrepository.com för att slå upp det här. När detta skrivs är 3.0.4.RELEASEden senaste versionen .

  4. Spara och stäng filen pom.xml.

    • Kontrollera att dina beroenden är korrekta genom att köra mvn -DskipTests clean install. Om du inte ser BUILD SUCCESSkan du felsöka och lösa problemet innan du fortsätter.
  5. Gå till mappen src/main/resources i projektet och skapa en application.yml fil i en textredigerare.

  6. Ange inställningarna för din appregistrering med de värden som du skapade tidigare, till exempel:

    spring:
      cloud:
        azure:
          active-directory:
            b2c:
              enabled: true
              base-uri: https://<your-tenant-initial-domain-name>.b2clogin.com/<your-tenant-initial-domain-name>.onmicrosoft.com/
              credential:
                client-id: <your-application-ID>
                client-secret: '<secret-value>'
              login-flow: sign-up-or-sign-in
              logout-success-url: <your-logout-success-URL>
              user-flows:
                sign-up-or-sign-in: <your-sign-up-or-sign-in-user-flow-name> 
                profile-edit: <your-profile-edit-user-flow-name> 
                password-reset: <your-password-reset-user-flow-name> 
              user-name-attribute-name: <your-user-name-attribute-name> 
    

    Observera att värdet omges av client-secret enkla citattecken. Detta är nödvändigt eftersom värdet för <secret-value> nästan säkert innehåller vissa tecken som kräver att vara inom enkla citattecken när de finns i YAML.

    Kommentar

    När detta skrivs är den fullständiga listan över Active Directory B2C Spring Integration-värden som är tillgängliga för användning i application.yml följande:

    spring:
      cloud:
        azure:
          active-directory:
            b2c:
              enabled: true
              base-uri:
              credential:
                client-id:
                client-secret:
              login-flow:  
              logout-success-url:
              user-flows:
                sign-up-or-sign-in:
                profile-edit: # optional
                password-reset: # optional
              user-name-attribute-name:
    

    Den application.yml filen finns i exempel på spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application på GitHub.

  7. Spara och stäng application.yml-filen.

  8. Skapa en mapp med namnet controller i src/main/java/<yourGroupId>/<yourGroupId> och ersätt <yourGroupId> med det värde som du angav för Grupp.

  9. Skapa en ny Java-fil med namnet WebController.java i mappen controller och öppna den i en textredigerare.

  10. Ange följande kod, ändra yourGroupId på rätt sätt och spara och stäng sedan filen:

    package yourGroupId.yourGroupId.controller;
    
    import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
    import org.springframework.security.oauth2.core.user.OAuth2User;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Controller
    public class WebController {
    
        private void initializeModel(Model model, OAuth2AuthenticationToken token) {
            if (token != null) {
                final OAuth2User user = token.getPrincipal();
    
                model.addAttribute("grant_type", user.getAuthorities());
                model.addAllAttributes(user.getAttributes());
            }
        }
    
        @GetMapping(value = "/")
        public String index(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "home";
        }
    
        @GetMapping(value = "/greeting")
        public String greeting(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "greeting";
        }
    
        @GetMapping(value = "/home")
        public String home(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "home";
        }
    }
    

    Eftersom varje metod i kontrollanten anropar initializeModel(), och den metoden anropar model.addAllAttributes(user.getAttributes());, kan alla HTML-sidor i src/main/resources/templates komma åt något av dessa attribut, till exempel ${name}, ${grant_type}eller ${auth_time}. Värdena som returneras från user.getAttributes() är i själva verket anspråken id_token för autentiseringen. Den fullständiga listan över tillgängliga anspråk visas i Microsofts identitetsplattform ID-token.

  11. Skapa en mapp med namnet security i src/main/java/<yourGroupId>/<yourGroupId> och ersätt yourGroupId med det värde som du angav för Grupp.

  12. Skapa en ny Java-fil med namnet WebSecurityConfiguration.java i mappen security och öppna den i en textredigerare.

  13. Ange följande kod, ändra yourGroupId på rätt sätt och spara och stäng sedan filen:

    package yourGroupId.yourGroupId.security;
    
    import com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cOidcLoginConfigurer;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @EnableWebSecurity
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        private final AadB2cOidcLoginConfigurer configurer;
    
        public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
            this.configurer = configurer;
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .apply(configurer)
            ;
        }
    }
    
  14. Kopiera home.html-filen från spring-cloud-azure-starter-active-directory-b2c-sample: aad-b2c-web-application till src/main/resources/templates och ersätt ${your-profile-edit-user-flow} och ${your-password-reset-user-flow} med namnen på de användarflöden som du skapade tidigare.

Kompilera och testa din app

  1. Öppna en kommandotolk och byt katalog till mappen där appens pom.xml-fil finns.

  2. Skapa Spring Boot-programmet med Maven och kör det, till exempel:

    Kommentar

    Det är oerhört viktigt att tiden enligt systemklockan under vilken den lokala spring boot-appen körs är korrekt. Det finns mycket lite tolerans för klocksnedställning när du använder OAuth 2.0. Även tre minuters felaktighet kan orsaka att inloggningen misslyckas med ett fel som liknar [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. När detta skrivs har time.gov en indikator på hur långt från klockan är från den faktiska tiden. Appen har körts med en snedställning på +0,019 sekunder.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. När ditt program har skapats och startats av Maven öppnar du http://localhost:8080/ i en webbläsare. Du kommer att omdirigeras till inloggningssidan.

    Inloggningssida för webbapp.

  4. Välj länken med text som rör inloggning. Du bör omdirigeras till Azure AD B2C för att starta autentiseringsprocessen.

  5. När du har loggat in bör du se exemplet home page från webbläsaren.

    Webbappen har loggats in.

Felsökning

I följande avsnitt beskrivs hur du löser vissa problem som du kan stöta på.

Attributnamn saknas i attribut

När du kör exemplet kan du få ett undantag med meddelandet Missing attribute 'name' in attributes. Loggen för det här undantaget ser ut ungefär som följande utdata:

java.lang.IllegalArgumentException: Missing attribute 'name' in attributes
at org.springframework.security.oauth2.core.user.DefaultOAuth2User.<init>(DefaultOAuth2User.java:67) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser.<init>(DefaultOidcUser.java:89) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:144) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:63) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]

Om du får det här felet dubbelkollar du användararbetsflödet som du skapade i Självstudie: Skapa användarflöden i Azure Active Directory B2C. När du skapar användararbetsflödet måste du för Användarattribut och anspråk välja attribut och anspråk som visningsnamn. Se också till att konfigurera user-name-attribute-name korrekt i application.yml-filen.

Logga in med loopar till B2C-slutpunkten

Det här problemet beror troligen på förorenade cookies för localhost. Rensa cookies för localhost och försök igen.

Sammanfattning

I den här självstudien skapade du ett nytt Java-webbprogram med hjälp av Azure Active Directory B2C Starter, konfigurerade en ny Azure AD B2C-klientorganisation och registrerade ett nytt program i den och konfigurerade sedan ditt program att använda Spring-anteckningar och -klasser för att skydda webbappen.

Rensa resurser

När de inte längre behövs använder du Azure Portal för att ta bort de resurser som skapats i den här artikeln för att undvika oväntade kostnader.

Nästa steg

Om du vill veta mer om Spring och Azure kan du fortsätta till dokumentationscentret för Spring i Azure.