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
- Een Azure-abonnement. Als u nog geen account hebt, maakt u een gratis account voordat u begint.
- Een ondersteunde JDK (Java Development Kit). Zie Java-ondersteuning voor Azure en Azure Stack voor meer informatie over de JDK's die beschikbaar zijn voor gebruik bij het ontwikkelen in Azure.
- Apache Maven, versie 3.0 of hoger.
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
Blader naar https://start.spring.io/.
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.
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
Meld u aan bij https://portal.azure.com.
Selecteer Een resource maken. Zoek naar Azure Active Directory B2C.
Selecteer Maken.
Selecteer Een nieuwe Azure AD B2C-tenant maken.
Geef voor de naam van de organisatie en de initiële domeinnaam de juiste waarden op en selecteer Vervolgens Maken.
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.
Een toepassingsregistratie aan uw Spring Boot-app toevoegen
Selecteer in het deelvenster Beheren App-registraties en selecteer vervolgens Nieuwe registratie.
Voer in het veld Naam de naam van uw app in en selecteer Registreren.
Selecteer App-registraties in het deelvenster Beheren en selecteer vervolgens de naam van de toepassing die u hebt gemaakt.
Selecteer Verificatie en voeg vervolgens een platform toe en vervolgens web. Stel de omleidings-URI's
http://localhost:8080/login/oauth2/code/
in op en selecteer Vervolgens Configureren.
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.
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
Navigeer naar de hoofdpagina van uw tenant. Selecteer in de sectie Beleid van het linkerdeelvenster gebruikersstromen en selecteer vervolgens Nieuwe gebruikersstroom.
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.
Ga vanaf de opdrachtregel naar de map waarin u het .zip-bestand hebt uitgepakt dat u hebt gedownload van Spring Initializr.
Navigeer naar de bovenliggende map voor uw project en open het pom.xml Maven-projectbestand in een teksteditor.
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-b2c
versie de nieuwste versie die beschikbaar is. Mogelijk kunt u mvnrepository.com gebruiken om dit op te zoeken.Gebruik voor de
spring-boot-starter-thymeleaf
versie die overeenkomt met de versie van Spring Boot die u hierboven hebt geselecteerd, bijvoorbeeld2.3.4.RELEASE
.Gebruik
thymeleaf-extras-springsecurity5
hiervoor de nieuwste versie die beschikbaar is. Mogelijk kunt u mvnrepository.com gebruiken om dit op te zoeken. Vanaf dit schrijven is3.0.4.RELEASE
de nieuwste versie .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 zietBUILD SUCCESS
, kunt u het probleem oplossen voordat u doorgaat.
- Controleer of uw afhankelijkheden juist zijn door uit te voeren
Navigeer naar de map src/main/resources in uw project en maak een application.yml-bestand in een teksteditor.
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.
Sla het bestand application.yml op en sluit het.
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.Maak een nieuw Java-bestand met de naam WebController.java in de map controller en open het in een teksteditor.
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-aanroepenmodel.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 geretourneerdeuser.getAttributes()
waarden zijn in feite de claims van deid_token
voor de verificatie. De volledige lijst met beschikbare claims wordt vermeld in id-tokens van het Microsoft Identity Platform.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.Maak een nieuw Java-bestand met de naam WebSecurityConfiguration.java in de map security en open het in een teksteditor.
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) ; } }
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
Open een opdrachtprompt en ga naar de map waarin het bestand pom.xml van uw app zich bevindt.
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
Nadat uw toepassing is gebouwd en gestart door Maven, opent u
http://localhost:8080/
in een webbrowser. U wordt dan omgeleid naar de aanmeldingspagina.Selecteer de koppeling met tekst met betrekking tot het aanmelden. U moet Azure AD B2C omleiden om het verificatieproces te starten.
Nadat u bent aangemeld, ziet u het voorbeeld
home page
in de browser.
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.