Übung: Anmelden von Benutzern mit der Microsoft-Authentifizierungsbibliothek

Abgeschlossen

In dieser Übung verwenden Sie die Microsoft-Authentifizierungsbibliothek für Java (MSAL4J), um die Authentifizierung in einer Java-Beispielwebanwendung hinzuzufügen und es Benutzern zu ermöglichen, sich mit ihren Microsoft Entra-Konten anzumelden.

Die Beispielanwendung, die Sie in dieser Übung verwenden, ist eine Java-Servlet-Anwendung, die es Benutzern ermöglicht, sich anzumelden, und sie zeigt den Benutzernamen sowie grundlegende Profilinformationen an. Außerdem ermöglicht sie es Ihnen, die Microsoft Graph-API aufzurufen, um Benutzerinformationen anzuzeigen.

Erstellen einer Java-Webanwendung

Verwenden Sie in Ihrer Shell oder Befehlszeile Folgendes:

  1. Erstellen Sie einen Ordner für die Anwendung.

    mkdir ~/javawebapp
    
  2. Klonen Sie die Beispielanwendung aus dem GitHub-Repository in den neuen Ordner.

    git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
    
  3. Wechseln Sie zu dem Ordner, in dem sich die Beispielanwendung für diese Übung befindet.

    cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
    

Konfigurieren der Anwendung

Öffnen Sie das Anwendungsprojekt in Ihrer bevorzugten IDE, z. B. IntelliJ oder Visual Studio Code, um den Code zu konfigurieren.

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

  2. Suchen Sie in der Eigenschaft aad.authority die Zeichenfolge {enter-your-tenant-id-here}. Ersetzen Sie den vorhandenen Wert durch den Wert der Verzeichnis-ID (Mandanten-ID) – wie im folgenden Bild gezeigt – da die App mithilfe der Option Nur Konten in diesem Organisationsverzeichnis registriert wurde.

  3. Suchen Sie in der Eigenschaft aad.clientId die Zeichenfolge {enter-your-client-id-here}, und ersetzen Sie den vorhandenen Wert durch den Wert der Anwendungs-ID (Client-ID) – der Wert clientId – der registrierten Anwendung, die Sie aus dem Azure-Portal kopiert haben.

    Screenshot, der die App-ID einer App hervorhebt, die mit Microsoft Entra ID im Azure-Portal registriert wurde.

  4. Suchen Sie in der Eigenschaft aad.secret die Zeichenfolge {enter-your-client-secret-here}, und ersetzen Sie den vorhandenen Wert durch den Wert des Schlüssels, den Sie beim Erstellen der App im Azure-Portal gespeichert haben.

Ausführen der Anwendung

  1. Stellen Sie sicher, dass Ihr Tomcat-Server ausgeführt wird und dass Sie über die Berechtigungen zur Bereitstellung einer Web-App auf diesem verfügen. Stellen Sie sicher, dass Ihre Serverhostadresse http://localhost:8080 lautet.

  2. Kompilieren und packen Sie das Projekt mit Maven:

    cd ~/javawebapp/2-Authorization-I/call-graph
    mvn clean package
    
  3. Suchen Sie die resultierende .war-Datei unter ./target/msal4j-servlet-graph.war. Um in Tomcat bereitzustellen, kopieren Sie diese .war-Datei in das Verzeichnis /webapps/ in Ihrem Tomcat-Installationsverzeichnis, und starten Sie den Tomcat-Server.

  4. Navigieren Sie in Ihrem Browser zu http://localhost:8080/msal4j-servlet-graph/. Sie werden umgeleitet, um sich mit Microsoft Entra ID anzumelden. Wenn Sie sich erfolgreich angemeldet haben, sollte eine Seite wie folgt angezeigt werden:

    Screenshot: Benutzername auf der Seite nach erfolgreicher Anmeldung bei der Beispielanwendung

  5. Wählen Sie die Schaltfläche ID-Tokendetails aus, um einige der decodierten Ansprüche des ID-Tokens anzuzeigen.

Übersicht über Authentifizierungscode

Den größten Teil des Authentifizierungscodes finden Sie in der Beispielanwendung im java/com/microsoft/azuresamples/msal4j/-Verzeichnis des Projekts. Er enthält mehrere Servlets, die die Authentifizierungsendpunkte in der Anwendung zum Anmelden, Abmelden und Verarbeiten des Umleitungsrückrufs von Microsoft Entra ID bereitstellen. Diese Servlets verwenden die Hilfsklassen im Verzeichnis java/com/microsoft/azuresamples/msal4j/helpers/, um die von MSAL bereitgestellten Authentifizierungsmethoden aufzurufen. In AuthenticationFilter.java ist ein Servlet-Filter definiert, der nicht authentifizierte Anforderungen an geschützte Routen an eine HTTP-Fehlerseite „401: Nicht autorisiert“ umleitet.

Zum Hinzufügen der Authentifizierung zu Ihrer Anwendung müssen Sie die Servlet-Klassen in die Verzeichnisse java/com/microsoft/azuresamples/msal4j/authservlets und java/com/microsoft/azuresamples/msal4j/authwebapp einfügen, die Hilfsklassen in das Verzeichnis java/com/microsoft/azuresamples/msal4j/helpers/ und den Servlet-Authentifizierungsfilter AuthenticationFilter.java in Ihre Projekte. Im Folgenden finden Sie weitere Informationen über den MSAL-Authentifizierungscode.

  1. MSAL4J ist in Maven verfügbar. Sie müssen MSAL4J als Abhängigkeit in der Datei pom.xml des Projekts hinzufügen:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.17.2</version>
    </dependency>
    
  2. Der erste Schritt des Anmeldeprozesses besteht darin, eine Anforderung an den /authorize-Endpunkt des Microsoft Entra-Mandanten zu senden. Die ConfidentialClientApplication-Instanz von MSAL4J wird genutzt, um eine Autorisierungsanforderungs-URL zu erstellen. Die App leitet den Browser an diese URL um, über die der Benutzer sich dann anmeldet. Der folgende Code ist ein Auszug aus der Implementierung der redirectToAuthorizationEndpoint-Methode in der AuthHelper-Klasse.

    final ConfidentialClientApplication client = getConfidentialClientInstance();
    AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters
                                                        .builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))
                                                        .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();
    contextAdapter.redirectUser(authorizeUrl);
    
    • AuthorizationRequestUrlParameters: Diese Parameter müssen zum Erstellen einer AuthorizationRequestUrl festgelegt werden.
    • REDIRECT_URI: Der Umleitungs-URI ist der URI, an den der Identitätsanbieter die Sicherheitstoken zurücksendet. Microsoft Entra ID leitet den Browser – zusammen mit dem Authentifizierungscode – an diesen URI weiter, nachdem die Benutzeranmeldeinformationen erfasst wurden. Sie muss mit dem Umleitungs-URI in der Microsoft Entra-App-Registrierung übereinstimmen.
    • SCOPES: Bereiche sind Berechtigungen, die von der Anwendung angefordert wurden. Normalerweise genügen die drei Bereiche openid profile offline_access zum Abrufen einer ID-Tokenantwort für eine Benutzeranmeldung. Diese Bereiche werden standardmäßig von der Microsoft-Authentifizierungsbibliothek festgelegt.
  3. Microsoft Entra ID zeigt der*dem Benutzer*in eine Anmeldeeingabeaufforderung an. Wenn der Anmeldeversuch erfolgreich ist, wird der Browser des Benutzers an den Umleitungsendpunkt der App umgeleitet, der einen gültigen Autorisierungscode enthält. Die Instanz ConfidentialClientApplication tauscht diesen Autorisierungscode dann für ein ID-Token und ein Zugriffstoken von Microsoft Entra ID aus. Der folgende Code ist ein Auszug aus der Implementierung der processAADCallback-Methode in der AuthHelper-Klasse.

    // First, validate the state, then parse any error codes in response, then extract the authCode. Then:
    // build the auth code params:
    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                                                        .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();
    
    // Get a client instance and leverage it to acquire the token:
    final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
    final IAuthenticationResult result = client.acquireToken(authParams).get();
    
    • 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 ausgeführt wird, werden die Tokenansprüche extrahiert. Wenn die Nonce-Überprüfung erfolgreich ist, werden die Ergebnisse in context (eine Instanz von IdentityContextData) platziert und in der Sitzung gespeichert. Die Anwendung kann diesen dann aus der Sitzung – mithilfe einer Instanz von IdentityContextAdapterServlet – instanziieren, wann immer darauf zugegriffen werden muss:

    // parse IdToken claims from the IAuthenticationResult:
    // (the next step - validateNonce - requires parsed claims)
    context.setIdTokenClaims(result.idToken());
    
    // if nonce is invalid, stop immediately! this could be a token replay!
    // if validation fails, throws exception and cancels auth:
    validateNonce(context);
    
    // set user to authenticated:
    context.setAuthResult(result, client.tokenCache().serialize());