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 von Spring Initializr mit dem Spring Boot Starter für Microsoft Entra ID erstellen.

In diesem Tutorial lernen Sie Folgendes:

  • Erstellen einer Java-Anwendung mit dem Spring Initializr
  • Konfigurieren von Azure Active Directory B2C
  • Schützen der Anwendung mit Spring Boot-Klassen und -Anmerkungen
  • Erstellen und Testen der Java-Anwendung

Microsoft Entra ID ist die cloudskalische Unternehmensidentitätslösung von Microsoft. Azure Active Directory B2C ergänzt den Featuresatz von Microsoft Entra ID, sodass Sie Kunden-, Verbraucher- und Bürgerzugriff auf Ihre B2C-Anwendungen (Business-to-Consumer) verwalten können.

Voraussetzungen

  • Ein Azure-Abonnement. Wenn Sie noch nicht über ein Abonnement verfügen, erstellen Sie ein kostenloses Konto, bevor Sie beginnen.
  • Ein unterstütztes Java Development Kit (JDK). Weitere Informationen zu den JDKs, die für die Entwicklung in Azure verfügbar sind, finden Sie im Artikel zur Java-Unterstützung in 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 einer App mithilfe von Spring Initializr

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

  2. Geben Sie die Werte gemäß dieser Anleitung ein. 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 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 für Spring Web und Spring Security hinzuzufügen.

    Hinweis

    Spring Security 5.5.1, 5.4.7, 5.3.10 und 5.2.11 wurden als Reaktion auf den CVE-Bericht zum folgenden Thema veröffentlicht: CVE-2021-22119: Denial-of-Service-Angriff mit „spring-security-oauth2-client“. Falls Sie die frühere Version verwenden, sollten Sie ein Upgrade durchführen.

  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 dem 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 über das Azure-Portal

  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. Wenn die Active Directory-Erstellung abgeschlossen ist, wählen Sie Ihr Konto in der oberen rechten Ecke aus, wählen Sie "Verzeichnis wechseln" und dann 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 im Bereich "Verwalten" App-Registrierungen und dann "Neue Registrierung" aus.

    Screenshot: Fenster mit Azure AD B2C-App-Registrierungen im Azure-Portal

  2. Geben Sie im Feld Name den Namen Ihrer App ein, und wählen Sie Registrieren aus.

    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“

Hinzufügen von App-Geheimnissen für Ihre App

Wählen Sie Zertifikate und Geheimnisse und dann Neuer geheimer Clientschlüssel aus. Geben Sie die Beschreibung für Ihr Geheimnis ein, und wählen Sie anschließend Hinzufügen aus. Wählen Sie nach der Erstellung des Geheimnisses das Symbol „Kopieren“ neben dem Geheimniswert aus, um den Wert für die Verwendung im weiteren Verlauf dieses Artikels zu kopieren.

Bildschirm „Geheimen Clientschlüssel hinzufügen“

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

Hinweis

Wenn Sie den Abschnitt "Zertifikate und Geheimnisse " verlassen und zurückkehren, können Sie den geheimen Wert nicht sehen. 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 das betreffende Geheimnis, und generieren Sie ein neues.

Hinzufügen eines Benutzerflows

  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. Im Folgenden finden Sie einige Punkte, die Sie beachten sollten, wenn Sie das andere Tutorial durcharbeiten.

    • Beginnen Sie mit dem Schritt, in dem Sie aufgefordert werden, Neuer Benutzerflow auszuwählen.
    • Wenn sich dieses Tutorial auf webapp1 bezieht, verwenden Sie stattdessen den Wert, den Sie für Gruppe eingegeben haben.
    • Wenn Sie Ansprüche auswählen, die aus den Flüssen zurückgegeben werden sollen, stellen Sie sicher, dass der Anzeigename ausgewählt ist. Ohne diesen Anspruch funktioniert die in diesem Lernprogramm integrierte App nicht.
    • Wenn Sie aufgefordert werden, den Benutzerfluss auszuführen, ist die zuvor angegebene Umleitungs-URL noch nicht aktiv. Sie können die Flüsse weiterhin ausführen, aber die Umleitung wird nicht erfolgreich abgeschlossen. Dies entspricht dem erwarteten Verhalten.
    • Wenn Sie „Nächste Schritte“ erreichen, kehren Sie zu diesem Tutorial zurück.

    Führen Sie alle Schritte im Lernprogramm aus: Erstellen von Benutzerflüssen in Azure Active Directory B2C zum Erstellen von Benutzerflüssen für "Registrieren und Anmelden", "Profilbearbeitung" und "Kennwortzurücksetzung".

    Von Azure AD B2C werden sowohl lokale Konten als auch soziale Netzwerke als Identitätsanbieter unterstützt. 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 Benutzerflows 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 Maven-Projektdatei pom.xml 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-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 Version 3.0.4.RELEASE.

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

    • Überprüfen Sie, ob ihre Abhängigkeiten richtig sind, indem Sie mvn -DskipTests clean install ausführen. Wenn das Problem nicht angezeigt wird BUILD SUCCESS, beheben Sie das Problem, bevor Sie fortfahren.
  5. Navigieren Sie in Ihrem Projekt zum Ordner src/main/resources, und erstellen Sie eine Datei application.yml in einem Text-Editor.

  6. Geben Sie die Einstellungen für Ihre App-Registrierung mithilfe der zuvor erstellten Werte an. 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> mit ziemlicher Sicherheit einige Zeichen enthält, die in einfache Anführungszeichen eingeschlossen werden müssen, wenn sie in YAML vorhanden sind.

    Hinweis

    Zum Zeitpunkt der Erstellung dieses Artikels lautet 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 im Beispiel "spring-cloud-azure-starter-active-directory-b2c" verfügbar: aad-b2c-web-application auf GitHub.

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

  8. Erstellen Sie einen Ordner namens Controller in src/Standard/java/<yourGroupId/<yourGroupId>>, und ersetzen Sie den für "Group" eingegebenen <yourGroupId> Wert.

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

  10. Geben Sie den folgenden Code ein, ändern Sie yourGroupId entsprechend, und 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 auf jedes dieser Attribute zugreifen, z. B. auf ${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 namens "Sicherheit" in "src/Standard/java/<yourGroupId/<yourGroupId>>", und ersetzen Sie ihn durch yourGroupId den Wert, den Sie für "Group" eingegeben haben.

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

  13. Geben Sie den folgenden Code ein, ändern Sie yourGroupId entsprechend, und 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 to src/Standard/resources/templates, und ersetzen Sie die ${your-profile-edit-user-flow} Namen ${your-password-reset-user-flow} der Zuvor erstellten Benutzerflüsse.

Erstellen und Testen der 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 mit Maven die Spring Boot-Anwendung, und führen Sie sie aus. Beispiel:

    Hinweis

    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 nur eine sehr geringe Toleranz bei Uhrabweichungen. 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 durch Maven erstellt und gestartet wurde, öffnen Sie http://localhost:8080/ in einem Webbrowser. Daraufhin sollten Sie zur Anmeldeseite weitergeleitet werden.

    Anmeldeseite für Web-App

  4. Wählen Sie den Link mit dem Text aus, der sich auf die Anmeldung bezieht. Daraufhin sollten Sie zu Azure AD B2C weitergeleitet werden, um den Authentifizierungsprozess zu starten.

  5. Nachdem Sie sich erfolgreich angemeldet haben, sollte das Beispiel home page aus dem Browser angezeigt werden.

    Erfolgreiche Anmeldung für Web-App

Problembehandlung

In den folgenden Abschnitten wird beschrieben, wie Sie einige Probleme beheben, die ggf. auftreten können.

Fehlender Attributname in 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]

Falls dieser Fehler auftritt, sollten Sie noch einmal den Benutzerworkflow überprüfen, den Sie unter Tutorial: Erstellen von Benutzerflows in Azure Active Directory B2C erstellt 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, dass Sie user-name-attribute-name in der Datei application.yml richtig konfigurieren.

Anmelden mit Schleifen beim B2C-Endpunkt

Die Ursache dieses Problems sind wahrscheinlich unsaubere Cookies für localhost. Bereinigen Sie die Cookies für localhost, und wiederholen Sie den Vorgang.

Zusammenfassung

In diesem Tutorial haben Sie mit Azure Active Directory B2C Starter eine neue Java-Webanwendung erstellt, einen neuen Azure AD B2C-Mandanten konfiguriert und eine neue Anwendung darin registriert. Anschließend haben Sie Ihre Anwendung zur Verwendung der Spring-Anmerkungen und -Klassen zum Schützen der Web-App konfiguriert.

Bereinigen von Ressourcen

Verwenden Sie das Azure-Portal, um die in diesem Artikel erstellten Ressourcen zu löschen, wenn Sie sie nicht mehr benötigen, um unerwartete Gebühren zu vermeiden.

Nächste Schritte

Weitere Informationen zu Spring und Azure finden Sie im Dokumentationscenter zu Spring in Azure.