Dela via


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 hjälp av Spring Initializr- med Spring Boot Starter för Microsoft Entra-ID.

I den här handledningen lär du dig att:

  • Skapa ett Java-program med Spring Initializr
  • Konfigurera Azure Active Directory B2C
  • Skydda programmet med Spring Boot-klasser och anteckningar
  • Skapa och testa ditt Java-program

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

Viktig

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 Projectväljer du Maven Project.
    • Under Languageväljer du Java.
    • Under Spring Bootväljer du 2.7.11.
    • Under Gruppanger Artifact och Name 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-.

    Obs

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

  3. Välj Generera projektoch 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 för yourProject.

    .
    ├── 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 Active Directory-instansen

  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 en ny Azure AD B2C-klientorganisation.

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

  5. För Organisationsnamn och Första domännamnetanger 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 katalogoch väljer sedan den katalog 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ägga till en programregistrering för din Spring Boot-app

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

    Skärmbild av Azure-portalen som visar skärmen Registreringar för Azure AD B2C-appar.

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

    Azure AD B2C ett formulär för registrering av en applikation.

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

    skärmen Appregistreringar med visningsnamnet valt.

  4. Välj autentiseringoch sedan Lägg till en plattform och sedan Web. Ange omdirigeringsadresser till http://localhost:8080/login/oauth2/code/och välj därefter Konfigurera.

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

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

Lägga till apphemligheter för din app

Välj certifikat & hemligheteroch därefter Ny klienthemlighet. 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.

certifikat och hemligheter-skärmen med kopieringsknappen markerad.

Not

Om du lämnar avsnittet Certifikat & hemligheter och sedan kommer tillbaka, kommer du inte att kunna 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 att inkludera i application.yml-filen, till exempel bakåtstreck eller backtick. I så fall tar du bort hemligheten och genererar en till.

Lägg till användarflöde

  1. Gå till hyresgästens startsida. I avsnittet Principer i den vänstra rutan väljer du Användarflödenoch väljer 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älvstudiekursen.

    • Börja med steget där du uppmanas att välja Nytt användarflöde.
    • När den här självstudien refererar till webapp1, använd i stället det värde som du angav för grupp .
    • När du väljer anspråk som ska returneras från flödena kontrollerar du att Visningsnamn har valts. Utan det här anspråket fungerar inte appen som byggs i den här handledningen.
    • 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", återvänd till den här guiden.

    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 hjälp av 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 packade upp den .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>
    

    För spring-cloud-azure-starter-active-directory-b2canvänder du den senaste tillgängliga versionen. Du kanske kan använda mvnrepository.com för att söka upp informationen.

    För spring-boot-starter-thymeleafanvä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 den senaste versionen 3.0.4.RELEASE.

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

    Obs

    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 spring-cloud-azure-starter-active-directory-b2c-exempel: aad-b2c-web-application på GitHub.

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

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

  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 för id_token för autentiseringen. Den fullständiga listan över tillgängliga anspråk visas i ID-token för Microsofts identitetsplattform.

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

  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-exempel: aad-b2c-web-application till src/main/resources/templatesoch ersätt ${your-profile-edit-user-flow} och ${your-password-reset-user-flow} med namnen på de användarflöden som du skapade tidigare.

Skapa och testa din app

  1. Öppna en kommandotolk och ändra katalogen till mappen där appens pom.xml fil finns.

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

    Notera

    Det är oerhört viktigt att tiden enligt systemklockan under vilken den lokala spring boot-appen körs är korrekt. Det finns låg tolerans för klockfel 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 mycket din klocka skiljer sig från den faktiska tiden. Appen kördes framgångsrikt med en förskjutning 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 bör omdirigeras till inloggningssidan.

    inloggningssida för webbappar.

  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 exempel home page från webbläsaren.

    Lyckad inloggning i webbappen.

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 kravvälja attribut och krav för 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 du inte längre behöver det kan du använda Azure-portalen för att ta bort resurserna som skapas i den här artikeln för att undvika oväntade avgifter.

Nästa steg

Om du vill veta mer om Spring och Azure fortsätter du till dokumentationscentret för Spring on Azure.