Delen via


Aanmelden met Azure Active Directory B2C toevoegen aan een Spring-web-app

In dit artikel leest u hoe u een Java-app maakt met aanmeldingsmogelijkheden met behulp van Spring Initializr- met de Spring Boot Starter voor Microsoft Entra-id.

In deze zelfstudie leert u het volgende:

  • Een Java-toepassing maken met spring Initializr
  • Azure Active Directory B2C configureren
  • De toepassing beveiligen met Spring Boot-klassen en aantekeningen
  • Uw Java-toepassing bouwen en testen

Microsoft Entra ID is de bedrijfsidentiteitsoplossing op cloudschaal van Microsoft. Azure Active Directory B2C- een aanvulling is op de functieset van Microsoft Entra ID, zodat u klant-, consument- en burgertoegang tot uw B2C-toepassingen (Business To Consumer) kunt beheren.

Voorwaarden

Belangrijk

Spring Boot versie 2.5 of hoger is vereist om de stappen in dit artikel uit te voeren.

Een app maken met Spring Initializr

  1. Blader naar https://start.spring.io/.

  2. Vul de waarden in volgens deze richtlijnen. De labels en indeling kunnen verschillen van de afbeelding die hier wordt weergegeven.

    • Selecteer onder het -projectde Maven-project.
    • Onder Language, selecteer Java.
    • Selecteer 2.7.11onder Spring Boot.
    • Voer onder GroepArtifact en Name dezelfde waarde in met behulp van een korte beschrijvende tekenreeks. De gebruikersinterface kan sommige van deze velden automatisch invullen terwijl u typt.
    • Selecteer in het deelvenster Afhankelijkheden de optie Afhankelijkheden toevoegen. Gebruik de gebruikersinterface om afhankelijkheden toe te voegen aan Spring Web- en Spring Security-.

    Notitie

    Spring Security 5.5.1, 5.4.7, 5.3.10 en 5.2.11 zijn vrijgegeven om het volgende CVE-rapport te verhelpen CVE-2021-22119: Denial-of-Service-aanval met spring-security-oauth2-client. Als u de oudere versie gebruikt, voert u een upgrade uit.

  3. Kies Genereer projecten download vervolgens het project naar een locatie op uw lokale computer. Verplaats het gedownloade bestand naar een map met de naam van uw project en pak het bestand uit. De bestandsindeling moet er ongeveer als volgt uitzien, met de waarde die u hebt ingevoerd voor Groep in plaats van 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
    

Een Microsoft Entra-exemplaar maken en initialiseren

Het Active Directory-exemplaar maken

  1. Meld u aan bij https://portal.azure.com.

  2. Selecteer Een resource aanmaken. Zoek naar Azure Active Directory B2C.

    Maak een nieuw Azure Active Directory B2C-exemplaar met behulp van Azure Portal.

  3. Selecteer maken.

    Azure Marketplace-vermelding voor Azure Active Directory B2C.

  4. Selecteer Een nieuwe Azure AD B2C-tenant maken.

    Azure Portal-optie voor het maken van een nieuwe Azure AD B2C-tenant.

  5. Geef voor organisatienaam en initiële domeinnaamde juiste waarden op en selecteer vervolgens Maken.

    scherm voor Tenant maken in Azure AD B2C.

  6. Wanneer het maken van Active Directory is voltooid, selecteert u uw account in de rechterbovenhoek, kiest u Schakelen tussen directory'sen selecteert u vervolgens de directory die is aangemaakt. U wordt omgeleid naar de startpagina van de nieuwe tenant. Zoek vervolgens naar b2c en selecteer Azure AD B2C-.

    Zoek de Azure AD B2C-service.

Een toepassingsregistratie voor uw Spring Boot-app toevoegen

  1. Selecteer in het deelvenster BeherenApp-registratiesen selecteer vervolgens Nieuwe registratie.

    schermopname van Azure Portal met het scherm Azure AD B2C-app-registraties.

  2. In het veld Naam voert u de app-naam in en vervolgens selecteert u Registreren.

    Azure AD B2C een aanvraagformulier registreren.

  3. Op het -deelvenster Beheren selecteer je App-registratiesen vervolgens selecteer je de naam van de toepassing die je hebt gemaakt.

    scherm voor app-registraties met geselecteerde weergavenaam.

  4. Selecteer verificatie, dan een platform toevoegen, dan Web. Stel de omleidings-URI's in op http://localhost:8080/login/oauth2/code/en selecteer vervolgens Configureren .

    Opties geselecteerd voor verificatie, een platform, web toevoegen.

    Webscherm configureren met het veld Omleidings-URI's geselecteerd.

App-geheimen voor uw app toevoegen

Selecteer Certificaten & geheimenen Nieuwe clientgeheimen. Voer de beschrijving van het geheim in en selecteer vervolgens Toevoegen. Nadat u het geheim hebt gemaakt, selecteert u het kopieerpictogram naast de geheime waarde om de waarde te kopiëren voor later in dit artikel.

Een scherm clientgeheim toevoegen.

scherm Certificaten en geheimen met de knop Kopiëren geselecteerd.

Notitie

Als u de Certificaten & geheimen sectie verlaat en terugkomt, kunt u de geheime waarde niet zien. In dat geval moet u een ander geheim maken en kopiëren voor toekomstig gebruik. Af en toe kan de gegenereerde geheime waarde tekens bevatten die problematisch zijn voor opname in het application.yml-bestand, zoals backslash of backtick. In dat geval moet u dat geheim negeren en nog een geheim genereren.

Gebruikersstroom toevoegen

  1. Navigeer naar de hoofdpagina van uw tenant. Selecteer in het gedeelte Beleid van het linkerdeelvenster Gebruikersstromenen selecteer vervolgens Nieuwe gebruikersstroom.

  2. U verlaat deze zelfstudie nu, voert een andere zelfstudie uit en gaat terug naar deze zelfstudie wanneer u klaar bent. Hier zijn een paar dingen om rekening mee te houden wanneer u naar de andere handleiding gaat.

    • Begin met de stap die u vraagt om nieuwe gebruikersstroom te selecteren.
    • Wanneer deze zelfstudie verwijst naar webapp1, gebruikt u in plaats daarvan de waarde die u hebt ingevoerd voor Groep.
    • Wanneer u claims selecteert die moeten worden geretourneerd uit de stromen, moet u ervoor zorgen dat weergavenaam is geselecteerd. Zonder deze claim werkt de app die in deze zelfstudie wordt gebouwd niet.
    • Wanneer u wordt gevraagd om de gebruikersstromen uit te voeren, is de omleidings-URL die u eerder hebt opgegeven nog niet actief. U kunt de processen nog steeds uitvoeren, maar de omleiding wordt niet succesvol afgerond. Dit wordt verwacht.
    • Wanneer u 'Volgende stappen' bereikt, keert u terug naar deze handleiding.

    Volg alle stappen in Zelfstudie: Gebruikersstromen maken in Azure Active Directory B2C om gebruikersstromen te maken voor 'registreren en aanmelden', 'profiel bewerken' en 'wachtwoord opnieuw instellen'.

    Azure AD B2C ondersteunt lokale accounts en sociale id-providers. Zie Registreren en aanmelden met een GitHub-account instellen met behulp van Azure Active Directory B2Cvoor een voorbeeld van het maken van een GitHub-id-provider.

Uw app configureren en compileren

Nu u het Azure AD B2C-exemplaar en enkele gebruikersstromen hebt gemaakt, verbindt u uw Spring-app met het Azure AD B2C-exemplaar.

  1. Gebruik de "cd"-opdracht in de commandoregel om naar de map te gaan waar u het .zip-bestand hebt uitgepakt dat u van Spring Initializr hebt gedownload.

  2. Navigeer naar de bovenliggende map voor uw project en open het pom.xml Maven-projectbestand in een teksteditor.

  3. Voeg de afhankelijkheden voor Spring OAuth2-beveiliging toe aan de 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>
    

    Gebruik voor de spring-cloud-azure-starter-active-directory-b2cde nieuwste versie die beschikbaar is. Mogelijk kunt u mvnrepository.com gebruiken om dit op te zoeken.

    Gebruik voor de spring-boot-starter-thymeleafde versie die overeenkomt met de versie van Spring Boot die u hierboven hebt geselecteerd, bijvoorbeeld 2.3.4.RELEASE.

    Gebruik voor thymeleaf-extras-springsecurity5de nieuwste versie die beschikbaar is. Mogelijk kunt u mvnrepository.com gebruiken om dit op te zoeken. Op het moment van schrijven is de nieuwste versie 3.0.4.RELEASE.

  4. Sla het pom.xml bestand op en sluit het.

    • Controleer of uw afhankelijkheden juist zijn door mvn -DskipTests clean installuit te voeren. Als u BUILD SUCCESSniet ziet, kunt u het probleem oplossen voordat u doorgaat.
  5. Navigeer naar de src/main/resources map in uw project en maak een application.yml bestand in een teksteditor.

  6. Geef de instellingen voor uw app-registratie op met behulp van de waarden die u eerder hebt gemaakt; bijvoorbeeld:

    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> 
    

    U ziet dat de client-secret waarde tussen enkele aanhalingstekens staat. Dit is nodig omdat de waarde van <secret-value> vrijwel zeker bepaalde tekens bevat die binnen enkele aanhalingstekens moeten staan wanneer deze aanwezig zijn in YAML.

    Notitie

    Vanaf dit schrijven is de volledige lijst met Active Directory B2C Spring Integration-waarden die beschikbaar zijn voor gebruik in application.yml het volgende:

    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:
    

    Het bestand application.yml is beschikbaar in spring-cloud-azure-starter-active-directory-b2c-voorbeeld: aad-b2c-web-application op GitHub.

  7. Sla het application.yml bestand op en sluit het.

  8. Maak een map met de naam controller in src/main/java/<yourGroupId>/<yourGroupId>, waarbij u <yourGroupId> vervangt door de waarde die u hebt ingevoerd voor Groep.

  9. Maak een nieuw Java-bestand met de naam WebController.java in de controller map en open het in een teksteditor.

  10. Voer de volgende code in, wijzig yourGroupId op de juiste manier en sla het bestand op en sluit het:

    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";
        }
    }
    

    Omdat elke methode in de controller initializeModel()aanroept en die methode model.addAllAttributes(user.getAttributes());aanroept, heeft elke HTML-pagina in src/main/resources/templates toegang tot een van deze kenmerken, zoals ${name}, ${grant_type}of ${auth_time}. De waarden die worden geretourneerd door user.getAttributes() zijn in feite de claims van de id_token voor de verificatie. De volledige lijst met beschikbare claims wordt vermeld in Microsoft Identity Platform ID-tokens.

  11. Maak een map met de naam security in src/main/java/<yourGroupId>/<yourGroupId>, waarbij u yourGroupId vervangt door de waarde die u hebt ingevoerd voor Group.

  12. Maak een nieuw Java-bestand met de naam WebSecurityConfiguration.java in de map security en open het in een teksteditor.

  13. Voer de volgende code in, wijzig yourGroupId op de juiste manier en sla het bestand op en sluit het:

    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. Kopieer het home.html-bestand uit spring-cloud-azure-starter-active-directory-b2c-voorbeeld: aad-b2c-web-application naar src/main/resources/templatesen vervang de ${your-profile-edit-user-flow} en ${your-password-reset-user-flow} door de namen van de gebruikersstromen die u eerder hebt gemaakt.

Uw app bouwen en testen

  1. Open een opdrachtprompt en wijzig de map in de map waarin het pom.xml bestand van uw app zich bevindt.

  2. Bouw uw Spring Boot-toepassing met Maven en voer deze uit; bijvoorbeeld:

    Notitie

    Het is uiterst belangrijk dat de tijd volgens de systeemklok waarop de lokale Spring Boot-app draait, nauwkeurig is. Er is weinig tolerantie voor klokverschil bij het gebruik van OAuth 2.0. Zelfs drie minuten onnauwkeurigheid kan ervoor zorgen dat de aanmelding mislukt met een foutmelding die vergelijkbaar is met [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. Op het moment van schrijven heeft time.gov een indicator van hoeveel uw klok afwijkt van de werkelijke tijd. De app is uitgevoerd met een scheefheid van +0,019 seconden.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. Nadat uw toepassing is gebouwd en gestart door Maven, opent u http://localhost:8080/ in een webbrowser; u moet worden omgeleid naar de aanmeldingspagina.

    aanmeldingspagina voor web-apps.

  4. Selecteer de koppeling met tekst met betrekking tot het aanmelden. U wordt omgeleid naar Azure AD B2C om het verificatieproces te starten.

  5. Nadat u bent aangemeld, ziet u het voorbeeld home page in de browser.

    Web app succesvolle login.

Probleemoplossing

In de volgende secties wordt beschreven hoe u een aantal problemen kunt oplossen die kunnen optreden.

Ontbrekende kenmerknaam in kenmerken

Tijdens het uitvoeren van het voorbeeld krijgt u mogelijk een uitzondering met het bericht Missing attribute 'name' in attributes. Het logboek voor deze uitzondering ziet er ongeveer als volgt uit:

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]

Als u deze fout krijgt, controleert u opnieuw de gebruikersflow die u hebt gemaakt in Handleiding: Gebruikersstromen maken in Azure Active Directory B2C. Houd bij het maken van de gebruikerswerkstroom er rekening mee dat u voor gebruikerskenmerken en -claimsde juiste kenmerken en claims kiest voor weergavenaam. Zorg er ook voor dat u user-name-attribute-name juist configureert in het application.yml-bestand.

Aanmelden met routings naar B2C-eindpunt

Dit probleem wordt waarschijnlijk veroorzaakt door vervuilde cookies voor localhost. Verwijder cookies voor localhost en probeer het opnieuw.

Samenvatting

In deze zelfstudie hebt u een nieuwe Java-webtoepassing gemaakt met behulp van de Azure Active Directory B2C-starter, een nieuwe Azure AD B2C-tenant geconfigureerd en er een nieuwe toepassing in geregistreerd. Vervolgens hebt u uw toepassing geconfigureerd voor het gebruik van de Spring-aantekeningen en -klassen om de web-app te beveiligen.

Resources opschonen

Wanneer u deze niet meer nodig hebt, gebruikt u de Azure Portal om de resources die in dit artikel zijn gemaakt, te verwijderen om onverwachte kosten te voorkomen.

Volgende stappen

Ga naar het Documentatiecentrum van Spring op Azure voor meer informatie over Spring en Azure.