Hinzufügen der Anmeldung mit Azure Active Directory B2C zu einer Spring Web App
In diesem Artikel erfahren Sie, wie Sie eine Java-App mit Anmeldefunktion mithilfe Spring Initializr- mit dem Spring Boot Starter für Microsoft Entra ID erstellen.
In diesem Tutorial erfahren Sie, wie Sie:
- Erstellen einer Java-Anwendung mithilfe des Spring Initializr
- Konfigurieren von Azure Active Directory B2C
- Schützen der Anwendung mit Spring Boot-Klassen und -Anmerkungen
- Erstellen und Testen ihrer Java-Anwendung
Microsoft Entra ID ist die cloudbasierte Unternehmensidentitätslösung von Microsoft. Azure Active Directory B2C komplementiert den Funktionsumfang von Microsoft Entra ID, sodass Sie den Zugriff von Kunden, Verbrauchern und Bürgern auf Ihre Business-to-Consumer-Anwendungen (B2C) verwalten können.
Voraussetzungen
- Ein Azure-Abonnement. Wenn Sie noch kein Konto haben, erstellen Sie ein kostenloses Konto, bevor Sie beginnen.
- Ein unterstütztes Java Development Kit (JDK). Weitere Informationen zu den für die Entwicklung in Azure verfügbaren JDKs finden Sie unter Java-Unterstützung für Azure und Azure Stack.
- Apache Maven, Version 3.0 oder höher.
Wichtig
Spring Boot Version 2.5 oder höher ist erforderlich, um die Schritte in diesem Artikel auszuführen.
Erstellen Sie eine App mit Spring Initializr
Wechseln Sie zu https://start.spring.io/.
Füllen Sie die Werte gemäß dieser Anleitung aus. Die Beschriftungen und das Layout können sich von der hier gezeigten Abbildung unterscheiden.
- Wählen Sie unter Projekt die Option Maven-Projekt aus.
- Wählen Sie unter Sprache die Option Java aus.
- Wählen Sie unter Spring Boot die Option 2.7.11 aus.
- Geben Sie unter Gruppe, Artefakt und Name denselben Wert mit einer kurzen beschreibenden Zeichenfolge ein. Die Benutzeroberfläche kann einige dieser Felder während der Eingabe automatisch ausfüllen.
- Wählen Sie im Bereich Abhängigkeiten die Option Abhängigkeiten hinzufügen aus. Verwenden Sie die Benutzeroberfläche, um Abhängigkeiten von Spring Web und Spring Securityhinzuzufügen.
Anmerkung
Spring Security 5.5.1, 5.4.7, 5.3.10 und 5.2.11 wurden freigegeben, um den folgenden CVE-Bericht CVE-2021-22119: Denial-of-Service-Angriff mit Spring-security-oauth2-clientzu beheben. Wenn Sie die ältere Version verwenden, führen Sie ein Upgrade durch.
Klicken Sie auf Projekt generieren, und laden Sie das Projekt dann in einen Pfad auf dem lokalen Computer herunter. Verschieben Sie die heruntergeladene Datei in ein Verzeichnis, das nach Ihrem Projekt benannt ist, und entpacken Sie die Datei. Das Dateilayout sollte in etwa wie folgt aussehen, wobei der Wert, den Sie für Gruppe eingegeben haben,
yourProject
ersetzt.. ├── 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
Erstellen und Initialisieren einer Microsoft Entra-Instanz
Erstellen der Active Directory-Instanz
Melden Sie sich bei https://portal.azure.com an.
Wählen Sie Ressource erstellen. Suchen Sie nach Azure Active Directory B2C.
Klicken Sie auf Erstellen.
Wählen Sie Neuen Azure AD B2C-Mandanten erstellen.
Geben Sie für Organisationsname und Name der Anfangsdomänedie entsprechenden Werte an, und wählen Sie dann Erstellen aus.
Wählen Sie nach Abschluss der Active Directory-Erstellung oben rechts Ihr Konto und dann die Option Verzeichnis wechseln und das erstellte Verzeichnis aus. Sie werden zur Startseite des neuen Mandanten umgeleitet. Suchen Sie anschließend nach
b2c
, und wählen Sie Azure AD B2C aus.
Hinzufügen einer Anwendungsregistrierung für Ihre Spring Boot-App
Wählen Sie unter Verwalten die Option App-Registrierungen und dann Neue Registrierung aus.
Geben Sie im Feld Name Ihren App-Namen ein, und wählen Sie dann Registrierenaus.
Wählen Sie im Bereich Verwalten die Option App-Registrierungen und dann den von Ihnen erstellten Anwendungsnamen aus.
Wählen Sie nacheinander die Optionen Authentifizierung, Plattform hinzufügen und Web aus. Legen Sie die Umleitungs-URIs auf
http://localhost:8080/login/oauth2/code/
fest, und wählen Sie dann die Option Konfigurieren aus.
Fügen Sie App-Geheimnisse zu Ihrer App hinzu
Wählen Sie Zertifikate & Geheimnisse und dann Neue geheime Clientschlüssel aus. Geben Sie die Beschreibung für Ihr Geheimnis ein, und wählen Sie anschließend Hinzufügen aus. Nachdem Sie den geheimen Schlüssel erstellt haben, wählen Sie das Kopiersymbol neben dem geheimen Wert aus, um den Wert zu kopieren, der weiter unten in diesem Artikel verwendet werden soll.
Anmerkung
Wenn Sie den Abschnitt Zertifikate & Geheimnisse verlassen und dann wieder darauf zugreifen, wird der Wert des geheimen Schlüssels nicht mehr angezeigt. In diesem Fall müssen Sie ein weiteres Geheimnis erstellen und zur späteren Verwendung kopieren. Der generierte Geheimniswert kann gelegentlich Zeichen enthalten, die für die Einbindung in die Datei application.yml problematisch sind, z. B. umgekehrte Schrägstriche oder Backticks. Verwerfen Sie in diesem Fall dieses Geheimnis und generieren Sie ein neues.
Benutzerfluss hinzufügen
Navigieren Sie zur Startseite Ihres Mandanten. Wählen Sie im linken Bereich im Abschnitt Richtlinien die Option Benutzerflow aus, und wählen Sie dann Neuer Benutzerflow aus.
Sie verlassen nun dieses Lernprogramm, führen ein weiteres Lernprogramm aus, und kehren Sie zu diesem Lernprogramm zurück, wenn Sie fertig sind. Hier sind einige Dinge, die Sie beachten sollten, wenn Sie zum anderen Tutorial gehen.
- Beginnen Sie mit dem Schritt, in dem Sie aufgefordert werden, Neuer Benutzerflow auszuwählen.
- Wenn dieses Tutorial sich auf
webapp1
bezieht, verwenden Sie stattdessen den Wert, den Sie für Gruppe eingegeben haben. - Wenn Sie Ansprüche auswählen, die von den Flows zurückgegeben werden sollen, stellen Sie sicher, dass Anzeigename ausgewählt ist. Ohne diesen Anspruch funktioniert die App nicht, die in diesem Tutorial erstellt wird.
- Wenn Sie aufgefordert werden, den Benutzerfluss auszuführen, ist die zuvor angegebene Umleitungs-URL noch nicht aktiv. Sie können die Flows trotzdem ausführen, aber die Umleitung wird nicht erfolgreich abgeschlossen. Dies wird erwartet.
- Wenn Sie "Nächste Schritte" erreichen, kehren Sie zu dieser Anleitung zurück.
Führen Sie alle Schritte im Tutorial : Benutzerflüsse in Azure Active Directory B2C erstellen in aus, um Benutzerflüsse für „Registrieren und Anmelden”, „Profilbearbeitung” und „Kennwortzurücksetzung” zu erstellen.
Azure AD B2C unterstützt lokale Konten sowie Anbieter für soziale Identitäten. Ein Beispiel für die Erstellung eines GitHub-Identitätsanbieters finden Sie unter Einrichten der Registrierung und Anmeldung mit einem GitHub-Konto mithilfe von Azure Active Directory B2C.
Konfigurieren und Kompilieren Ihrer App
Nachdem Sie nun die Azure AD B2C-Instanz und einige Benutzerflüsse erstellt haben, verbinden Sie Ihre Spring-App mit der Azure AD B2C-Instanz.
Wechseln Sie in der Befehlszeile mit „cd“ zu dem Verzeichnis, in das Sie die ZIP-Datei entpackt haben, die Sie von Spring Initializr heruntergeladen haben.
Navigieren Sie zum übergeordneten Ordner für Ihr Projekt, und öffnen Sie die pom.xml Maven-Projektdatei in einem Text-Editor.
Fügen Sie der Datei pom.xml die Abhängigkeiten für Spring OAuth2-Sicherheit hinzu:
<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>
Verwenden Sie für die Angabe
spring-cloud-azure-starter-active-directory-b2c
die neueste verfügbare Version. Möglicherweise können Sie mvnrepository.com verwenden, um diese Angabe nachzuschlagen.Verwenden Sie für
spring-boot-starter-thymeleaf
die Version, die der oben ausgewählten Version von Spring Boot entspricht, z. B.2.3.4.RELEASE
.Verwenden Sie für
thymeleaf-extras-springsecurity5
die neueste verfügbare Version. Möglicherweise können Sie mvnrepository.com verwenden, um diese Angabe nachzuschlagen. Zum Zeitpunkt der Erstellung dieses Artikels ist die neueste Version3.0.4.RELEASE
.Speichern und schließen Sie die pom.xml Datei.
- Stellen Sie sicher, dass Ihre Abhängigkeiten korrekt sind, indem Sie
mvn -DskipTests clean install
ausführen. WennBUILD SUCCESS
nicht angezeigt wird, analysieren und beheben Sie das Problem, bevor Sie fortfahren.
- Stellen Sie sicher, dass Ihre Abhängigkeiten korrekt sind, indem Sie
Navigieren Sie zum src/main/resources Ordner in Ihrem Projekt, und erstellen Sie eine application.yml Datei in einem Text-Editor.
Geben Sie die Einstellungen für die App-Registrierung mithilfe der zuvor erstellten Werte an. Zum Beispiel:
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>
Beachten Sie, dass der Wert
client-secret
in einfache Anführungszeichen eingeschlossen wird. Dies ist erforderlich, da der Wert von<secret-value>
höchstwahrscheinlich gewisse Zeichen enthält, die in einzelnen Anführungszeichen stehen müssen, wenn sie in YAML erscheinen.Anmerkung
Zum Zeitpunkt der Erstellung dieses Dokuments ist die vollständige Liste der Active Directory B2C Spring Integration Werte, die für die Verwendung in application.yml verfügbar sind, wie folgt:
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:
Die application.yml-Datei ist in spring-cloud-azure-starter-active-directory-b2c-Beispiel verfügbar: aad-b2c-web-application auf GitHub.
Speichern und schließen Sie die application.yml Datei.
Erstellen Sie einen Ordner mit dem Namen controller in src/main/java/<yourGroupId>/<yourGroupId>, und ersetzen Sie
<yourGroupId>
durch den Wert, den Sie für Group eingegeben haben.Erstellen Sie eine neue Java-Datei namens WebController.java im Controller Ordner, und öffnen Sie sie in einem Text-Editor.
Geben Sie den folgenden Code ein, ändern Sie
yourGroupId
entsprechend, speichern und schließen Sie die Datei: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"; } }
Da jede Methode im Controller
initializeModel()
aufruft und diese Methodemodel.addAllAttributes(user.getAttributes());
aufruft, kann jede HTML-Seite in src/main/resources/templates/templates auf jedes dieser Attribute zugreifen, z. B.${name}
,${grant_type}
oder${auth_time}
. Die vonuser.getAttributes()
zurückgegebenen Werte sind tatsächlich die Ansprüche vonid_token
für die Authentifizierung. Die vollständige Liste der verfügbaren Ansprüche finden Sie unter Microsoft Identity Platform: ID-Token.Erstellen Sie einen Ordner mit dem Namen security in src/main/java/<yourGroupId>/<yourGroupId>, und ersetzen Sie
yourGroupId
durch den Wert, den Sie für Group eingegeben haben.Erstellen Sie eine neue Java-Datei namens WebSecurityConfiguration.java im Sicherheitsordner, und öffnen Sie sie in einem Text-Editor.
Geben Sie den folgenden Code ein, ändern Sie
yourGroupId
entsprechend, speichern und schließen Sie die Datei: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) ; } }
Kopieren Sie die home.html-Datei aus spring-cloud-azure-starter-active-directory-b2c-Beispiel: aad-b2c-web-application in src/main/resources/templates, und ersetzen Sie die
${your-profile-edit-user-flow}
und${your-password-reset-user-flow}
durch die Namen der Zuvor erstellten Benutzerflüsse.
Erstellen und Testen Ihrer App
Öffnen Sie eine Eingabeaufforderung, und wechseln Sie zu dem Ordner, in dem sich die Datei pom.xml Ihrer App befindet.
Erstellen Sie Ihre Spring Boot-Anwendung mit Maven, und führen Sie sie aus. Zum Beispiel:
Anmerkung
Es ist außerordentlich wichtig, dass die Zeit gemäß der Systemuhr, unter der die lokale Spring Boot-App ausgeführt wird, genau ist. Bei der Verwendung von OAuth 2.0 gibt es sehr wenig Toleranz für Uhrenabweichungen. Schon drei Minuten Ungenauigkeit können dazu führen, dass die Anmeldung mit einem Fehler ähnlich
[invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z
fehlschlägt. Zum Zeitpunkt der Erstellung dieses Artikels stellt time.gov einen Indikator dafür bereit, wie weit Ihre Uhr von der tatsächlichen Zeit abweicht. Die App wurde erfolgreich mit einer Abweichung von +0,019 Sekunden ausgeführt.mvn -DskipTests clean package mvn -DskipTests spring-boot:run
Nachdem Ihre Anwendung von Maven erstellt und gestartet wurde, öffnen Sie
http://localhost:8080/
in einem Webbrowser. Sie sollten zur Anmeldeseite umgeleitet werden.Wählen Sie den Link mit Text aus, der sich auf die Anmeldung bezieht. Sie werden zu Azure AD B2C umgeleitet, um den Authentifizierungsprozess zu starten.
Nach erfolgreicher Anmeldung sollte das Beispiel
home page
im Browser angezeigt werden.
Fehlerbehebung
In den folgenden Abschnitten wird beschrieben, wie Sie einige Probleme beheben können, die auftreten können.
Fehlender Attributname in den Attributen
Beim Ausführen des Beispiels wird ggf. eine Ausnahme mit der folgenden Meldung angezeigt: Missing attribute 'name' in attributes
. Das Protokoll für diese Ausnahme sieht in etwa wie in der folgenden Ausgabe aus:
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]
Wenn dieser Fehler angezeigt wird, überprüfen Sie nochmals den Benutzerworkflow, den Sie im Lernprogramm : Erstellen von Benutzerflüssen in Azure Active Directory B2Cerstellt haben. Achten Sie beim Erstellen des Benutzerworkflows darauf, dass Sie für Benutzerattribute und Ansprüche die Attribute und Ansprüche für Anzeigename auswählen. Achten Sie außerdem darauf, user-name-attribute-name
in der datei application.yml ordnungsgemäß zu konfigurieren.
Anmelden mit Schleifen beim B2C-Endpunkt
Dieses Problem ist höchstwahrscheinlich auf verunreinigte Cookies für localhost
zurückzuführen. Bereinigen Sie Cookies für localhost
, und versuchen Sie es erneut.
Zusammenfassung
In diesem Lernprogramm haben Sie eine neue Java-Webanwendung mit dem Azure Active Directory B2C-Starter erstellt, einen neuen Azure AD B2C-Mandanten konfiguriert und eine neue Anwendung darin registriert und dann Ihre Anwendung so konfiguriert, dass sie die Spring-Anmerkungen und -Klassen zum Schutz der Web-App verwendet.
Bereinigen von Ressourcen
Wenn sie nicht mehr benötigt wird, verwenden Sie das Azure-Portal, um die in diesem Artikel erstellten Ressourcen zu löschen, um unerwartete Gebühren zu vermeiden.
Nächste Schritte
Um mehr über Spring und Azure zu erfahren, fahren Sie mit dem Spring on Azure-Dokumentationscenter fort.