Freigeben über


Aktivieren der Anmeldung für Java WebLogic-Apps mit MSAL4J mit Azure Active Directory B2C

In diesem Artikel wird eine Java Servlet-Anwendung veranschaulicht, die Benutzer bei Azure Active Directory B2C (Azure AD B2C) mithilfe der Microsoft Authentication Library for Java (MSAL4J) authentifiziert.

In der folgenden Abbildung wird die Topologie für diese App veranschaulicht:

Diagramm mit einer Übersicht über die Topologie der App.

Die App verwendet MSAL4J, um Benutzer anzumelden und ein ID-Token von Azure AD B2C abzurufen. Das ID-Token beweist, dass der Benutzer bei einem Azure AD B2C-Mandanten authentifiziert wird.

Voraussetzungen

Empfehlungen

  • Vertrautheit mit den Java / Jakarta Servlets.
  • Vertrautheit mit Linux/OSX-Terminal.
  • jwt.ms zum Überprüfen Ihrer Token.
  • Fiddler zur Überwachung Ihrer Netzwerkaktivität und Problembehandlung.
  • Lesen Sie den Microsoft Entra ID-Blog, um mit den neuesten Entwicklungen auf dem neuesten Stand zu bleiben.

Einrichten des Beispiels

Die folgenden Abschnitte zeigen Ihnen, wie der Beispielcode für die Anwendung eingerichtet wird.

Klonen oder Herunterladen des Beispielrepositorys

Um das Beispiel zu klonen, öffnen Sie ein Bash-Fenster, und verwenden Sie den folgenden Befehl:

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/1-Authentication/sign-in-b2c

Wechseln Sie alternativ zum Repository ms-identity-msal-java-samples, laden Sie es dann als .zip-Datei herunter, und extrahieren Sie diese auf Ihre Festplatte.

Wichtig

Um Längenbeschränkungen für Dateipfade unter Windows zu vermeiden, klonen oder extrahieren Sie das Repository in ein Verzeichnis in der Nähe des Stamms Ihrer Festplatte.

Registrieren der Beispielanwendung bei Ihrem Azure AD B2C-Mandanten

Das Beispiel enthält eine vorab registrierte Anwendung für Testzwecke. Wenn Sie einen eigenen Azure AD B2C-Mandanten und Ihre eigene Anwendung verwenden möchten, führen Sie die Schritte in den folgenden Abschnitten aus, um die Anwendung im Azure-Portal zu registrieren und zu konfigurieren. Fahren Sie andernfalls mit den Schritten zum Ausführen des Beispiels fort.

Auswählen des Azure AD B2C-Mandanten, in dem Sie Ihre Anwendungen erstellen möchten

Verwenden Sie die folgenden Schritte, um den Mandanten auszuwählen:

  1. Melden Sie sich beim Azure-Portal an.

  2. Wenn Ihr Konto in mehreren Azure AD B2C-Mandanten vorhanden ist, wählen Sie Ihr Profil oben rechts im Azure-Portal aus und dann Verzeichnis wechseln, um Ihre Portalsitzung in den gewünschten Azure AD B2C-Mandanten zu ändern.

Erstellen von Benutzerflows und benutzerdefinierten Richtlinien

Informationen zum Erstellen von allgemeinen Benutzerflows wie „Registrierung und Anmeldung“, „Profilbearbeitung“ und „Kennwortzurücksetzung“ finden Sie unter Tutorial: Erstellen von Benutzerflows in Azure Active Directory B2C.

Sie sollten auch das Erstellen von Benutzerdefinierten Richtlinien in Azure Active Directory B2C in Betracht ziehen, dies liegt jedoch außerhalb des Umfangs dieses Tutorials.

Hinzufügen externer Identitätsanbieter

Siehe Tutorial: Hinzufügen eines Identitätsanbieters zu Ihrem Azure Active Directory B2C-Mandanten

Registrieren der App (ms-identity-b2c-java-servlet-webapp-authentication)

Gehen Sie wie folgt vor, um die App zu registrieren:

  1. Navigieren Sie zum Azure-Portal und klicken Sie auf Azure AD B2C.

  2. Wählen Sie im Navigationsbereich App-Registrierungen und dann Neue Registrierung aus.

  3. Geben Sie auf der daraufhin angezeigten Seite Anwendung registrieren die folgenden Registrierungsinformationen Ihrer App ein:

    • Geben Sie im Abschnitt Name einen aussagekräftigen Anwendungsnamen ein, der den Benutzern der App angezeigt wird (beispielsweise ms-identity-b2c-java-servlet-webapp-authentication).
    • Wählen Sie unter Unterstützte Kontotypen die Option Konten in allen Organisationsverzeichnissen und persönliche Microsoft-Konten (z.B. Skype, Xbox, Outlook.com) aus.
    • Wählen Sie im Abschnitt Umleitungs-URI (optional) im Kombinationsfeld die Option Web aus, und geben Sie die folgenden Umleitungs-URIs ein:http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_redirect
  4. Wählen Sie Registrieren aus, um die Anwendung zu erstellen.

  5. Suchen Sie auf der Registrierungsseite der App den Wert Anwendungsclient-ID, und notieren Sie ihn zur späteren Verwendung. Sie verwenden diesen Wert in den Konfigurationsdateien Ihrer App.

  6. Wählen Sie Speichern aus, um Ihre Änderungen zu speichern.

  7. Wählen Sie auf der Registrierungsseite der App Zertifikate & Geheimnisse aus, um die Seite zu öffnen, in dem Sie Geheimnisse generieren und Zertifikate hochladen können.

  8. Wählen Sie im Abschnitt Geheime Clientschlüssel die Option Neuer geheimer Clientschlüssel aus.

  9. Geben Sie eine Beschreibung ein (z. B. App-Geheimnis).

  10. Wählen Sie eine der verfügbaren Laufzeiten aus: In 1 Jahr, In 2 Jahren oder Läuft nie ab.

  11. Wählen Sie Hinzufügen. Der generierte Wert wird angezeigt.

  12. Kopieren und speichern Sie den generierten Wert zur Verwendung in späteren Schritten. Sie benötigen diesen Wert für die Konfigurationsdateien des Codes. Dieser Schlüsselwert wird nicht erneut angezeigt, und Sie können ihn auch nicht auf andere Weise abrufen. Achten Sie daher darauf, ihn aus dem Azure-Portal zu speichern, bevor Sie zu einem anderen Bildschirm oder Bereich navigieren.

Konfigurieren der App (ms-identity-b2c-java-servlet-webapp-authentication) für die Verwendung der App-Registrierung

Führen Sie die folgenden Schritte aus, um die App zu konfigurieren:

Hinweis

In den folgenden Schritten ist ClientID identisch mit Application ID oder AppId.

  1. Öffnen Sie das Projekt in Ihrem IDE.

  2. Öffnen Sie die Datei ./src/main/resources/authentication.properties.

  3. Suchen Sie die Eigenschaft aad.clientId, und ersetzen Sie den vorhandenen Wert durch die Anwendungs-ID clientId der ms-identity-b2c-java-servlet-webapp-authentication-Anwendung aus dem Azure-Portal.

  4. Suchen Sie den App-Schlüssel aad.secret, und ersetzen Sie den vorhandenen Wert durch den Wert, den Sie beim Erstellen der ms-identity-b2c-java-servlet-webapp-authentication-Anwendung gespeichert haben (im Azure-Portal).

  5. Suchen Sie die aad.scopes-Eigenschaft, und ersetzen Sie die vorhandene AnwendungsclientId durch den Wert, den Sie in aad.clientId im Schritt 1 dieses Abschnitts eingefügt haben.

  6. Suchen Sie die Eigenschaft aad.authority, und ersetzen Sie die erste Instanz von fabrikamb2c durch den Namen des Azure AD B2C-Mandanten, in dem Sie die ms-identity-b2c-java-servlet-webapp-authentication-Anwendung im Azure-Portal erstellt haben.

  7. Suchen Sie die Eigenschaft aad.authority, und ersetzen Sie die zweite Instanz von fabrikamb2c durch den Namen des Azure AD B2C-Mandanten, in dem Sie die ms-identity-b2c-java-servlet-webapp-authentication-Anwendung im Azure-Portal erstellt haben.

  8. Suchen Sie die Eigenschaft aad.signInPolicy, und ersetzen Sie sie durch den Namen der Registrierungs-/Anmelde-Benutzerflussrichtlinie, die Sie im Azure AD B2C-Mandanten erstellt haben, in dem Sie die ms-identity-b2c-java-servlet-webapp-authentication-Anwendung im Azure-Portal erstellt haben.

  9. Suchen Sie die Eigenschaft aad.passwordResetPolicy, und ersetzen Sie sie durch den Namen der Benutzerflussrichtlinie zur Kennwortrücksetzung, die Sie im Azure AD B2C-Mandanten erstellt haben, in dem Sie die ms-identity-b2c-java-servlet-webapp-authentication-Anwendung im Azure-Portal erstellt haben.

  10. Suchen Sie die Eigenschaft aad.editProfilePolicy, und ersetzen Sie sie durch den Namen der Benutzerflussrichtlinie zum Bearbeiten des Profils, die Sie im Azure AD B2C-Mandanten erstellt haben, in dem Sie die ms-identity-b2c-java-servlet-webapp-authentication-Anwendung im Azure-Portal erstellt haben.

Erstellen des Beispiels

Um das Beispiel mit Maven zu erstellen, navigieren Sie zu dem Verzeichnis, das die pom.xml-Datei für das Beispiel enthält, und führen Sie dann den folgenden Befehl aus:

mvn clean package

Dieser Befehl generiert eine .war-Datei, die Sie auf verschiedenen Anwendungsservern ausführen können.

Ausführen des Beispiels

Bei diesen Anweisungen wird davon ausgegangen, dass Sie WebLogic installiert und einige Serverdomänen eingerichtet haben.

Bevor Sie in WebLogic bereitstellen können, führen Sie die folgenden Schritte aus, um einige Konfigurationsänderungen im Beispiel selbst vorzunehmen und dann das Paket zu erstellen oder neu zu erstellen:

  1. Suchen Sie im Beispiel die Datei application.properties oder authentication.properties , in der Sie die Client-ID, den Mandanten, die Umleitungs-URL usw. konfiguriert haben.

  2. Ändern Sie in dieser Datei die Verweise auf localhost:8080 oder localhost:8443 auf die URL und den Port, auf der WebLogic ausgeführt wird. Dies sollte standardmäßig localhost:7001 sein.

  3. Außerdem müssen Sie dieselbe Änderung in der Azure-App-Registrierung vornehmen, bei der Sie sie im Azure-Portal als Umleitungs-URI-Wert auf der Registerkarte Authentifizierung festlegen.

Führen Sie die folgenden Schritte aus, um das Beispiel über die Webkonsole für WebLogic bereitzustellen:

  1. Starten Sie den WebLogic-Server mithilfe von DOMAIN_NAME\bin\startWebLogic.cmd.

  2. Navigieren Sie in Ihrem Browser zur WebLogic-Webkonsole unter http://localhost:7001/console.

  3. Wechseln Sie zu Domänenstruktur >-Bereitstellungen, wählen Sie Installieren und Dateien hochladen aus, und suchen Sie dann nach der .war-Datei, die Sie mit Maven erstellt haben.

  4. Wählen Sie „Diese Bereitstellung als Anwendung installieren“ und klicken Sie auf Weiter, select Fertigstellen und dann Speichern.

  5. Die meisten Standardeinstellungen sollten einwandfrei sein, mit der Ausnahme, dass Sie die Anwendung benennen sollten, um dem Umleitungs-URI zu entsprechen, den Sie in der Beispielkonfiguration oder Azure-App-Registrierung festgelegt haben. Das heißt, wenn der Umleitungs-URI http://localhost:7001/msal4j-servlet-auth lautet, dann sollten Sie die Anwendung msal4j-servlet-auth benennen.

  6. Wechseln Sie zurück zu Domänenstruktur>Bereitstellungen, und starten Sie Ihre Anwendung.

  7. Navigieren Sie nach dem Start der Anwendung zu http://localhost:7001/<application-name>/. Sie sollten auf die Anwendung zugreifen können.

Untersuchen des Beispiels

Gehen Sie folgendermaßen vor, um das Beispiel zu erkunden:

  1. Beachten Sie den angemeldeten oder abgemeldeten Status, der in der Mitte des Bildschirms angezeigt wird.
  2. Wählen Sie in der Ecke die Schaltfläche „Kontextsensitiv“ aus. Diese Schaltfläche lautet Anmelden, wenn Sie die App zum ersten Mal ausführen.
  3. Folgen Sie auf der nächsten Seite den Anweisungen, und melden Sie sich mit einem Konto Ihres ausgewählten Identitätsanbieters an.
  4. Beachten Sie, dass die kontextsensitive Schaltfläche jetzt Abmelden lautet und Ihren Benutzernamen anzeigt.
  5. Klicken Sie auf ID-Tokendetails, um die decodierten Ansprüche des ID-Tokens anzuzeigen.
  6. Sie haben auch die Möglichkeit, Ihr Profil zu bearbeiten. Wählen Sie den Link aus, um Details wie Ihren Anzeigenamen, Ihren Aufenthaltsort und Ihren Beruf zu bearbeiten.
  7. Verwenden Sie die Schaltfläche in der Ecke, um sich abzumelden.
  8. Navigieren Sie nach dem Abmelden zur folgenden URL für die Tokendetailseite: http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_token_details. Hier können Sie sehen, wie die App anstelle der ID-Tokenansprüche einen 401: unauthorized-Fehler anzeigt.

Informationen zum Code

In diesem Beispiel wird die Verwendung von MSAL4J zum Anmelden von Benutzern bei Ihrem Azure AD B2C-Mandanten veranschaulicht.

Contents

Die folgende Tabelle zeigt den Inhalt des Beispielprojektordners:

Datei/Ordner Beschreibung
AuthHelper.java Hilfsfunktionen für die Authentifizierung.
Config.java Wird beim Start ausgeführt und konfiguriert den Eigenschaftenleser und das Protokollierungstool.
authentication.properties Microsoft Entra ID und Programmkonfiguration.
AuthenticationFilter.java Leitet nicht authentifizierte Anforderungen an geschützte Ressourcen auf eine 401-Seite um.
MsalAuthSession Instanziiert mit einem HttpSession. Speichert alle MSAL-bezogenen Sitzungsattribute im Sitzungsattribut.
____Servlet.java Alle verfügbaren Endpunkte werden in .java Klassen definiert, die auf ____Servlet.java enden.
CHANGELOG.md Liste der Änderungen am Beispiel.
CONTRIBUTING.md Richtlinien für einen Beitrag zum Beispiel.
LIZENZ Die Lizenz für das Beispiel.

ConfidentialClientApplication

Eine ConfidentialClientApplication Instanz wird in der AuthHelper.java-Datei erstellt, wie im folgenden Beispiel gezeigt. Dieses Objekt hilft beim Erstellen der Azure AD B2C-Autorisierungs-URL und auch beim Austauschen des Authentifizierungstokens für ein Zugriffstoken.

IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                     .builder(CLIENT_ID, secret)
                     .b2cAuthority(AUTHORITY + policy)
                     .build();

Es werden die folgenden Parameter für die Instanziierung verwendet:

  • Die Client-ID der App.
  • Der geheime Clientschlüssel, der eine Anforderung für vertrauliche Clientanwendungen ist.
  • Die Azure AD B2C Authority mit Verkettung mit der geeigneten UserFlowPolicy für die Registrierung, Anmeldung, Profilbearbeitung oder Kennwortzurücksetzung.

In diesem Beispiel werden diese Werte aus der Datei authentication.properties mithilfe eines Eigenschaftenlesers in der Config.java-Datei gelesen.

Ausführliche exemplarische Vorgehensweise

Die folgenden Schritte bieten eine exemplarische Vorgehensweise für die Funktionalität der App:

  1. Der erste Schritt des Anmeldeprozesses besteht darin, eine Anforderung an den /authorize-Endpunkt für Ihren Azure Active Directory B2C-Mandanten zu senden. Die MSAL4J-Instanz ConfidentialClientApplication wird verwendet, um eine Autorisierungsanforderungs-URL zu erstellen, und die App leitet den Browser zu dieser URL um, wie im folgenden Beispiel gezeigt:

    final ConfidentialClientApplication client = getConfidentialClientInstance(policy);
    final AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters
        .builder(REDIRECT_URI, Collections.singleton(SCOPES)).responseMode(ResponseMode.QUERY)
        .prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String redirectUrl = client.getAuthorizationRequestUrl(parameters).toString();
    Config.logger.log(Level.INFO, "Redirecting user to {0}", redirectUrl);
    resp.setStatus(302);
    resp.sendRedirect(redirectUrl);
    

    In der folgenden Liste werden die Features dieses Codes beschrieben:

    • AuthorizationRequestUrlParameters: Diese Parameter müssen zum Erstellen einer AuthorizationRequestUrl-Klasse festgelegt werden.

    • REDIRECT_URI: Wo Azure AD B2C den Browser zusammen mit dem Authentifizierungscode umleitet, nachdem die Benutzeranmeldeinformationen gesammelt wurden.

    • SCOPES: Bereiche stellen die Berechtigungen dar, die von der Anwendung angefordert wurden.

      Normalerweise reichen die drei Bereiche openid profile offline_access aus, um eine ID-Token-Antwort zu erhalten. MSAL4J erfordert jedoch alle Antworten von Azure AD B2C, um auch ein Zugriffstoken zu enthalten.

      Damit Azure AD B2C ein Zugriffstoken sowie ein ID-Token ausgibt, muss die Anforderung einen zusätzlichen Ressourcenbereich enthalten. Da für diese App kein externer Ressourcenbereich erforderlich ist, fügt sie eine eigene Client-ID als vierten Bereich hinzu, um ein Zugriffstoken zu erhalten.

      Eine vollständige Liste der von der App angeforderten Bereiche finden Sie in der Datei authentication.properties.

    • ResponseMode.QUERY: Azure AD B2C kann die Antwort als Formularparameter in einer HTTP POST-Anforderung oder als Abfragezeichenfolgenparameter in einer HTTP GET-Anforderung zurückgeben.

    • Prompt.SELECT_ACCOUNT: Azure AD B2C sollte den Benutzer dazu auffordern, das Konto auszuwählen, für das er sich authentifizieren möchte.

    • state: Eine eindeutige Variable, die von der App in die Sitzung in jeder Tokenanforderung festgelegt und nach Erhalt des entsprechenden Azure AD B2C-Umleitungsrückrufs zerstört wurde. Die Statusvariable stellt sicher, dass Azure AD B2C-Anforderungen an /auth_redirect endpoint tatsächlich von Azure AD B2C-Autorisierungsanforderungen stammen, die von dieser App und dieser Sitzung stammen, wodurch CSRF-Angriffe verhindert werden. Dies geschieht in der AADRedirectServlet.java-Datei.

    • nonce: Eine eindeutige Variable, die von der App in die Sitzung in jeder Tokenanforderung festgelegt und nach erhalt des entsprechenden Tokens zerstört wird. Diese Nonce wird in die resultierenden Token transkribiert, die von Azure AD B2C ausgegeben werden, wodurch sichergestellt wird, dass kein Token-Replay-Angriff stattfindet.

  2. Azure Active Directory B2C zeigt dem Benutzer eine Anmeldeeingabeaufforderung an. Wenn der Anmeldeversuch erfolgreich ist, wird der Browser des Benutzers zum Umleitungsendpunkt dieser App umgeleitet. Eine erfolgreiche Anforderung an diesen Endpunkt enthält einen Autorisierungscode.

  3. Anschließend wechselt die ConfidentialClientApplication-Instanz diesen Autorisierungscode für ein ID-Token und ein Zugriffstoken aus Azure Active Directory B2C, wie im folgenden Beispiel gezeigt:

    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                        .builder(authCode, new URI(REDIRECT_URI))
                        .scopes(Collections.singleton(SCOPES)).build();
    
    final ConfidentialClientApplication client = AuthHelper
            .getConfidentialClientInstance(policy);
    final Future<IAuthenticationResult> future = client.acquireToken(authParams);
    final IAuthenticationResult result = future.get();
    

    In der folgenden Liste werden die Features dieses Codes beschrieben:

    • AuthorizationCodeParameters: Diese Parameter müssen festgelegt werden, damit der Autorisierungscode für ein ID- und/oder ein Zugriffstoken ausgetauscht werden kann.
    • authCode: Hierbei handelt es sich um den Autorisierungscode, der am Umleitungsendpunkt empfangen wurde.
    • REDIRECT_URI: Der im vorherigen Schritt verwendete Umleitungs-URI muss noch mal übergeben werden.
    • SCOPES: Die im vorherigen Schritt verwendeten Bereiche müssen noch einmal übergeben werden.
  4. Wenn acquireToken erfolgreich ist, werden die Tokenansprüche extrahiert, und der Nonce-Anspruch wird anhand der in der Sitzung gespeicherten Nonce überprüft, wie im folgenden Beispiel gezeigt:

    parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache);
    validateNonce(msalAuth)
    processSuccessfulAuthentication(msalAuth);
    
  5. Wenn die Nonce erfolgreich überprüft wird, wird der Authentifizierungsstatus in eine serverseitige Sitzung eingefügt, wobei Methoden genutzt werden, die von der MsalAuthSession-Klasse verfügbar gemacht werden, wie im folgenden Beispiel gezeigt:

    msalAuth.setAuthenticated(true);
    msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
    

Weitere Informationen

Weitere Informationen zur Funktionsweise von OAuth 2.0-Protokollen in diesem Szenario und anderen Szenarien finden Sie unter Authentifizierungsszenarien für Microsoft Entra ID.

Nächster Schritt

Bereitstellen von Java WebLogic-Apps in WebLogic auf virtuellen Azure-Computern