Teilen über


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

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

  1. Wechseln Sie zu https://start.spring.io/.

  2. 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.

  3. 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

  1. Melden Sie sich bei https://portal.azure.com an.

  2. Wählen Sie Ressource erstellen. Suchen Sie nach Azure Active Directory B2C.

    Erstellen einer neuen Azure Active Directory B2C-Instanz mithilfe des Azure-Portals.

  3. Klicken Sie auf Erstellen.

    Azure Marketplace-Eintrag für Azure Active Directory B2C

  4. Wählen Sie Neuen Azure AD B2C-Mandanten erstellen.

    Option im Azure-Portal für die Erstellung eines neuen Azure AD B2C-Mandanten

  5. Geben Sie für Organisationsname und Name der Anfangsdomänedie entsprechenden Werte an, und wählen Sie dann Erstellen aus.

    Bildschirm: Mandant in Azure AD B2C erstellen

  6. 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.

    Ermitteln des Azure AD B2C-Diensts

Hinzufügen einer Anwendungsregistrierung für Ihre Spring Boot-App

  1. Wählen Sie unter Verwalten die Option App-Registrierungen und dann Neue Registrierung aus.

    Screenshot des Azure-Portals mit dem Bildschirm

  2. Geben Sie im Feld Name Ihren App-Namen ein, und wählen Sie dann Registrierenaus.

    Azure AD B2C: Formular für die Registrierung einer Anwendung

  3. Wählen Sie im Bereich Verwalten die Option App-Registrierungen und dann den von Ihnen erstellten Anwendungsnamen aus.

    Bildschirm „App-Registrierungen“ mit ausgewähltem Anzeigenamen

  4. 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ür die Authentifizierung ausgewählte Optionen, Plattform hinzufügen, Web

    Bildschirm „Web konfigurieren“ mit ausgewähltem Feld „Umleitungs-URIs“

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.

Bildschirm „Geheimen Clientschlüssel hinzufügen“

Bildschirm „Zertifikate und Geheimnisse“ mit ausgewählter Schaltfläche „Kopieren“

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

  1. 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.

  2. 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 webapp1bezieht, 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.

  1. 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.

  2. Navigieren Sie zum übergeordneten Ordner für Ihr Projekt, und öffnen Sie die pom.xml Maven-Projektdatei in einem Text-Editor.

  3. 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-springsecurity5die 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 Version 3.0.4.RELEASE.

  4. Speichern und schließen Sie die pom.xml Datei.

    • Stellen Sie sicher, dass Ihre Abhängigkeiten korrekt sind, indem Sie mvn -DskipTests clean installausführen. Wenn BUILD SUCCESSnicht angezeigt wird, analysieren und beheben Sie das Problem, bevor Sie fortfahren.
  5. Navigieren Sie zum src/main/resources Ordner in Ihrem Projekt, und erstellen Sie eine application.yml Datei in einem Text-Editor.

  6. 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.

  7. Speichern und schließen Sie die application.yml Datei.

  8. 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.

  9. Erstellen Sie eine neue Java-Datei namens WebController.java im Controller Ordner, und öffnen Sie sie in einem Text-Editor.

  10. 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 Methode model.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 von user.getAttributes() zurückgegebenen Werte sind tatsächlich die Ansprüche von id_token für die Authentifizierung. Die vollständige Liste der verfügbaren Ansprüche finden Sie unter Microsoft Identity Platform: ID-Token.

  11. 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.

  12. Erstellen Sie eine neue Java-Datei namens WebSecurityConfiguration.java im Sicherheitsordner, und öffnen Sie sie in einem Text-Editor.

  13. 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)
            ;
        }
    }
    
  14. 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

  1. Öffnen Sie eine Eingabeaufforderung, und wechseln Sie zu dem Ordner, in dem sich die Datei pom.xml Ihrer App befindet.

  2. 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
    
  3. Nachdem Ihre Anwendung von Maven erstellt und gestartet wurde, öffnen Sie http://localhost:8080/ in einem Webbrowser. Sie sollten zur Anmeldeseite umgeleitet werden.

    Web App-Anmeldeseite.

  4. 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.

  5. Nach erfolgreicher Anmeldung sollte das Beispiel home page im Browser angezeigt werden.

    Erfolgreiche Anmeldung in der Web-App.

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 localhostzurü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.