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 spring initializr med Spring Boot Starter för Microsoft Entra-ID.
I den här självstudien lär du dig att:
- Skapa ett Java-program med hjälp av Spring Initializr
- Konfigurera Azure Active Directory B2C
- Skydda programmet med Spring Boot-klasser och anteckningar
- Kompilera och testa Java-programmet
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
- En Azure-prenumeration. 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-stöd i Azure och Azure Stack.
- Apache Maven, version 3.0 eller senare.
Viktigt!
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 Projekt väljer du Maven-projekt.
- Under Språk väljer du Java.
- Under Spring Boot väljer du 2.7.11.
- Under Grupp, Artefakt och Namn anger du 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.
Kommentar
Spring Security 5.5.1, 5.4.7, 5.3.10 och 5.2.11 har släppts för att hantera följande CVE-rapport CVE-2021-22119: Denial-of-Service-attack med spring-security-oauth2-client. Om du använder den äldre versionen uppgraderar du den.
Välj Generera projekt och 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
yourProject
för .. ├── 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 en instans i Active Directory
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 ett nytt Azure AD B2C-innehavare.
För Organisationsnamn och Initialt domännamn anger 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 katalog och väljer sedan katalogen som skapats. Du omdirigeras till den nya klientorganisationens startsida. Sök sedan efter
b2c
och välj Azure AD B2C.
Lägg till en programregistrering för din Spring Boot-app
I fönstret Hantera väljer du Appregistreringar och sedan Ny registrering.
I fältet Namn anger du appens namn och väljer sedan Registrera.
I fönstret Hantera väljer du Appregistreringar och sedan det programnamn som du skapade.
Välj Autentisering och sedan Lägg till en plattform och sedan Webb. Ange omdirigerings-URI:er till
http://localhost:8080/login/oauth2/code/
och välj sedan Konfigurera.
Lägga till apphemligheter för din app
Välj Certifikat och hemligheter och sedan Nya klienthemligheter. 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.
Kommentar
Om du lämnar avsnittet Certifikat och hemligheter och kommer tillbaka kan du inte 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 för inkludering i application.yml-filen, till exempel omvänt snedstreck eller backtick. I så fall tar du bort hemligheten och genererar en till.
Lägg till användarflöde
Gå till klientorganisationens huvudsida. I avsnittet Principer i den vänstra rutan väljer du Användarflöden och 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älvstudien.
- Börja med det steg som begär att du väljer Nytt användarflöde.
- När den här självstudien refererar till
webapp1
använder du det värde som du angav för Grupp i stället. - När du väljer anspråk som ska returneras från flödena kontrollerar du att Visningsnamn är valt. Utan det här anspråket fungerar inte appen som skapas i den här självstudien.
- 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 går du tillbaka till den här självstudien.
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 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 packa upp .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>
spring-cloud-azure-starter-active-directory-b2c
För använder du den senaste tillgängliga versionen. Du kanske kan använda mvnrepository.com för att slå upp det här.spring-boot-starter-thymeleaf
För 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 är3.0.4.RELEASE
den senaste versionen .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 omges av
client-secret
enkla citattecken. Detta är nödvändigt eftersom värdet för<secret-value>
nästan säkert innehåller vissa tecken som kräver att vara inom enkla citattecken när de finns i YAML.Kommentar
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 exempel på spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application på GitHub.
Spara och stäng application.yml-filen.
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 Grupp.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åkenid_token
för autentiseringen. Den fullständiga listan över tillgängliga anspråk visas i Microsofts identitetsplattform ID-token.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 Grupp.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-sample: aad-b2c-web-application till src/main/resources/templates och ersätt
${your-profile-edit-user-flow}
och${your-password-reset-user-flow}
med namnen på de användarflöden som du skapade tidigare.
Kompilera och testa din app
Öppna en kommandotolk och byt katalog till mappen där appens pom.xml-fil finns.
Skapa Spring Boot-programmet med Maven och kör det, till exempel:
Kommentar
Det är oerhört viktigt att tiden enligt systemklockan under vilken den lokala spring boot-appen körs är korrekt. Det finns mycket lite tolerans för klocksnedställning 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 långt från klockan är från den faktiska tiden. Appen har körts med en snedställning 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 kommer att 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 exemplet
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 anspråk välja attribut och anspråk som 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 de inte längre behövs använder du Azure Portal för att ta bort de resurser som skapats i den här artikeln för att undvika oväntade kostnader.
Nästa steg
Om du vill veta mer om Spring och Azure kan du fortsätta till dokumentationscentret för Spring i Azure.