Share 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 de functie Spring Initializr
  • Azure Active Directory B2C configureren
  • De toepassing beveiligen met Spring Boot-klassen en -aantekeningen
  • Uw Java-toepassing ontwikkelen en testen

Microsoft Entra ID is de bedrijfsidentiteitsoplossing op cloudschaal van Microsoft. Azure Active Directory B2C complimenteert de functieset van Microsoft Entra ID, zodat u klant-, consument- en burgertoegang tot uw B2C-toepassingen (business-to-consumer) kunt beheren.

Vereisten

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 Project Maven Project.
    • Selecteer Java onder Taal.
    • Selecteer onder Spring Boot 2.7.11.
    • Voer onder Groep, Artefact en Naam dezelfde waarde in, met behulp van een korte beschrijvende tekenreeks. De gebruikersinterface kan sommige van deze velden automatisch invullen terwijl u typt.
    • Selecteer Afhankelijkheden toevoegen in het deelvenster Afhankelijkheden. 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 CVE-2021-22119 te verhelpen: Denial-of-Service-aanval met spring-security-oauth2-client. Als u de oudere versie gebruikt, voert u een upgrade uit.

  3. Selecteer Project genereren en download vervolgens het project naar een pad 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 maken. 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 de naam van de organisatie en de initiële domeinnaam de juiste waarden op en selecteer Vervolgens Maken.

    Scherm Tenant maken in Azure AD B2C.

  6. Wanneer het maken van Active Directory is voltooid, selecteert u uw account in de rechterbovenhoek, selecteert u Schakelen tussen mappen en selecteert u vervolgens de map die u hebt gemaakt. U wordt omgeleid naar de startpagina van de nieuwe tenant. b2c Zoek en selecteer vervolgens Azure AD B2C.

    Zoek de Azure AD B2C-service.

Een toepassingsregistratie aan uw Spring Boot-app toevoegen

  1. Selecteer in het deelvenster Beheren App-registraties en selecteer vervolgens Nieuwe registratie.

    Schermopname van Azure Portal met het scherm Azure AD B2C App-registraties.

  2. Voer in het veld Naam de naam van uw app in en selecteer Registreren.

    Azure AD B2C registreert een toepassingsformulier.

  3. Selecteer App-registraties in het deelvenster Beheren en selecteer vervolgens de naam van de toepassing die u hebt gemaakt.

    App-registraties scherm met weergavenaam geselecteerd.

  4. Selecteer Verificatie en voeg vervolgens een platform toe en vervolgens web. Stel de omleidings-URI'shttp://localhost:8080/login/oauth2/code/in op en selecteer Vervolgens Configureren.

    Opties die zijn geselecteerd voor verificatie, een platform, web toevoegen.

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

App-geheimen voor uw app toevoegen

Selecteer Certificaten en geheimen en vervolgens 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.

Voeg een scherm voor het clientgeheim toe.

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

Notitie

Als u de sectie Certificaten en geheimen 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 de sectie Beleid van het linkerdeelvenster gebruikersstromen en 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 volgen enkele dingen om rekening mee te houden wanneer u naar de andere zelfstudie gaat.

    • Begin met de stap die u vraagt om de stroom Nieuwe gebruiker te selecteren.
    • Wanneer deze zelfstudie verwijst webapp1, gebruikt u in plaats daarvan de waarde die u hebt ingevoerd voor Groep .
    • Zorg ervoor dat weergavenaam is geselecteerd wanneer u claims selecteert die moeten worden geretourneerd uit de stromen. 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 stromen nog steeds uitvoeren, maar de omleiding wordt niet voltooid. Dit is normaal.
    • Wanneer u 'Volgende stappen' bereikt, gaat u terug naar deze zelfstudie.

    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 Registratie en aanmelding met een GitHub-account instellen met behulp van Azure Active Directory B2C voor 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. Ga vanaf de opdrachtregel naar de map waarin u het .zip-bestand hebt uitgepakt dat u hebt gedownload van Spring Initializr.

  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-b2cversie de nieuwste versie die beschikbaar is. Mogelijk kunt u mvnrepository.com gebruiken om dit op te zoeken.

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

    Gebruik thymeleaf-extras-springsecurity5hiervoor de nieuwste versie die beschikbaar is. Mogelijk kunt u mvnrepository.com gebruiken om dit op te zoeken. Vanaf dit schrijven is 3.0.4.RELEASEde nieuwste versie .

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

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

  6. Geef de instellingen voor de registratie van uw app op met 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> bijna 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 application.yml-bestand is beschikbaar in spring-cloud-azure-starter-active-directory-b2c-voorbeeld: aad-b2c-web-application op GitHub.

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

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

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

  10. Voer de volgende code in, wijzig yourGroupId deze 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-aanroepen initializeModel()en die methode-aanroepen model.addAllAttributes(user.getAttributes());, elke HTML-pagina in src/main/resources/sjablonen toegang heeft tot een van deze kenmerken, zoals ${name}, ${grant_type}of ${auth_time}. De geretourneerde user.getAttributes() waarden zijn in feite de claims van de id_token voor de verificatie. De volledige lijst met beschikbare claims wordt vermeld in id-tokens van het Microsoft Identity Platform.

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

  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 deze 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/templates, en 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 ga naar de map waarin het bestand pom.xml van uw app zich bevindt.

  2. Maak de Spring Boot-toepassing met Maven en voer deze uit; bijvoorbeeld:

    Notitie

    Het is uiterst belangrijk dat de tijd volgens de systeemklok waaronder de lokale spring boot-app wordt uitgevoerd, nauwkeurig is. Er is weinig tolerantie voor klokverschil bij het gebruik van OAuth 2.0. Zelfs drie minuten onnauwkeurigheid kan ertoe leiden dat de aanmelding mislukt met een fout die vergelijkbaar is met [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. Vanaf dit schrijven heeft time.gov een indicator van hoe ver van de klok af is 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 wordt dan omgeleid naar de aanmeldingspagina.

    Aanmeldingspagina voor web-apps.

  4. Selecteer de koppeling met tekst met betrekking tot het aanmelden. U moet Azure AD B2C omleiden om het verificatieproces te starten.

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

    Web-app is aangemeld.

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 de gebruikerswerkstroom die u hebt gemaakt in de zelfstudie: Gebruikersstromen maken in Azure Active Directory B2C. Zorg ervoor dat u bij het maken van de gebruikerswerkstroom voor gebruikerskenmerken en -claims kenmerken en claims kiest voor weergavenaam. Zorg er ook voor dat u het application.yml-bestand correct configureertuser-name-attribute-name.

Aanmelden met lussen naar B2C-eindpunt

Dit probleem is waarschijnlijk te wijten aan vervuilde cookies voor localhost. Maak cookies op 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

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

Volgende stappen

Voor meer informatie over Spring en Azure gaat u door naar het documentatiecentrum van Spring op Azure.