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
- Ett Azure-abonnemang. Om du inte redan har ett skapar du ett kostnadsfritt konto innan du börjar.
- Ett Java Development Kit (JDK) som stöds. Mer information om de JDK:er som är tillgängliga för användning när du utvecklar i Azure finns i Java-support på Azure och Azure Stack.
- Apache Maven, version 3.0 eller senare.
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
Bläddra till https://start.spring.io/.
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.
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
Logga in på https://portal.azure.com.
Välj Skapa en resurs. Sök efter Azure Active Directory B2C.
Välj Skapa.
Välj Skapa en ny Azure AD B2C-klientorganisation.
För Organisationsnamn och Första domännamnetanger du lämpliga värden och väljer sedan Skapa.
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.
Lägga till en programregistrering för din Spring Boot-app
I fönstret Hantera väljer du Appregistreringaroch väljer sedan Ny registrering.
I fältet Namn anger du appens namn och väljer sedan Registrera.
I fönstret Hantera väljer du Appregistreringaroch väljer sedan det programnamn som du skapade.
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.
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.
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
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.
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.
Från kommandoraden, cd till katalogen där du packade upp den .zip-fil som du laddade ned från Spring Initializr.
Gå till den överordnade mappen för projektet och öppna pom.xml Maven-projektfilen i en textredigerare.
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-b2c
anvä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-thymeleaf
använder du den version som motsvarar den version av Spring Boot som du valde ovan, till exempel2.3.4.RELEASE
.För
thymeleaf-extras-springsecurity5
anvä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 versionen3.0.4.RELEASE
.Spara och stäng filen pom.xml.
- Kontrollera att dina beroenden är korrekta genom att köra
mvn -DskipTests clean install
. Om du inte serBUILD SUCCESS
kan du felsöka och lösa problemet innan du fortsätter.
- Kontrollera att dina beroenden är korrekta genom att köra
Gå till mappen src/main/resources i projektet och skapa en application.yml fil i en textredigerare.
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.
Spara och stäng filen application.yml.
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.Skapa en ny Java-fil med namnet WebController.java i mappen controller och öppna den i en textredigerare.
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 anroparmodel.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ånuser.getAttributes()
är i själva verket anspråken förid_token
för autentiseringen. Den fullständiga listan över tillgängliga anspråk visas i ID-token för Microsofts identitetsplattform.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.Skapa en ny Java-fil med namnet WebSecurityConfiguration.java i mappen security och öppna den i en textredigerare.
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) ; } }
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
Öppna en kommandotolk och ändra katalogen till mappen där appens pom.xml fil finns.
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
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.Välj länken med text som rör inloggning. Du bör omdirigeras till Azure AD B2C för att starta autentiseringsprocessen.
När du har loggat in bör du se exempel
home page
från webbläsaren.
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.