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
- Een Azure-abonnement. Als u nog geen account hebt, maakt u een gratis account voordat u begint.
- Een ondersteunde Java Development Kit (JDK). Zie Java-ondersteuning voor Azure en Azure Stackvoor meer informatie over de JDK's die beschikbaar zijn voor gebruik bij het ontwikkelen in Azure.
- Apache Mavenversie 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 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.
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
Meld u aan bij https://portal.azure.com.
Selecteer Een resource aanmaken. Zoek naar Azure Active Directory B2C.
Selecteer maken.
Selecteer Een nieuwe Azure AD B2C-tenant maken.
Geef voor organisatienaam en initiële domeinnaamde juiste waarden op en selecteer vervolgens Maken.
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-.
Een toepassingsregistratie voor uw Spring Boot-app toevoegen
Selecteer in het deelvenster BeherenApp-registratiesen selecteer vervolgens Nieuwe registratie.
In het veld Naam voert u de app-naam in en vervolgens selecteert u Registreren.
Op het -deelvenster Beheren selecteer je App-registratiesen vervolgens selecteer je de naam van de toepassing die je hebt gemaakt.
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 .
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.
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
Navigeer naar de hoofdpagina van uw tenant. Selecteer in het gedeelte Beleid van het linkerdeelvenster Gebruikersstromenen 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 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.
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.
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
de nieuwste versie die beschikbaar is. Mogelijk kunt u mvnrepository.com gebruiken om dit op te zoeken.Gebruik voor de
spring-boot-starter-thymeleaf
de versie die overeenkomt met de versie van Spring Boot die u hierboven hebt geselecteerd, bijvoorbeeld2.3.4.RELEASE
.Gebruik voor
thymeleaf-extras-springsecurity5
de nieuwste versie die beschikbaar is. Mogelijk kunt u mvnrepository.com gebruiken om dit op te zoeken. Op het moment van schrijven is de nieuwste versie3.0.4.RELEASE
.Sla het pom.xml bestand op en sluit het.
- Controleer of uw afhankelijkheden juist zijn door
mvn -DskipTests clean install
uit te voeren. Als uBUILD SUCCESS
niet ziet, kunt u het probleem oplossen voordat u doorgaat.
- Controleer of uw afhankelijkheden juist zijn door
Navigeer naar de src/main/resources map in uw project en maak een application.yml bestand in een teksteditor.
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.
Sla het application.yml bestand op en sluit het.
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.Maak een nieuw Java-bestand met de naam WebController.java in de controller map en open het in een teksteditor.
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 methodemodel.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 dooruser.getAttributes()
zijn in feite de claims van deid_token
voor de verificatie. De volledige lijst met beschikbare claims wordt vermeld in Microsoft Identity Platform ID-tokens.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.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
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/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
Open een opdrachtprompt en wijzig de map in de map waarin het pom.xml bestand van uw app zich bevindt.
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
Nadat uw toepassing is gebouwd en gestart door Maven, opent u
http://localhost:8080/
in een webbrowser; u moet worden omgeleid naar de aanmeldingspagina.Selecteer de koppeling met tekst met betrekking tot het aanmelden. U wordt omgeleid naar Azure AD B2C 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 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.