Oefening: gebruikers aanmelden met MSAL

Voltooid

In deze oefening gebruikt u de Microsoft Authentication Library for Java (MSAL4J) om verificatie toe te voegen in een Java-voorbeeldwebtoepassing en gebruikers toe te staan zich aan te melden met hun Microsoft Entra-account.

De voorbeeldtoepassing die u in deze oefening gebruikt, is een Java-servlet-toepassing waarmee gebruikers zich kunnen aanmelden en de gebruikersnaam en basisprofielgegevens kunnen weergeven. Hiermee kunt u ook de Microsoft Graph API aanroepen om bepaalde gebruikersgegevens weer te geven.

Een Java-webtoepassing maken

Vanuit de shell of vanaf de opdrachtregel:

  1. Maak een map voor de toepassing.

    mkdir ~/javawebapp
    
  2. Kloon de voorbeeldtoepassing uit de GitHub-opslagplaats naar de nieuwe map.

    git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
    
  3. Ga naar de map waarin de voorbeeldtoepassing voor deze oefening zich bevindt.

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

De toepassing configureren

Als u de code wilt configureren, opent u het toepassingsproject in uw favoriete IDE, zoals IntelliJ of VS Code.

  1. Open het bestand ./src/main/resources/authentication.properties .

  2. Zoek de tekenreeks aad.authorityin de {enter-your-tenant-id-here} eigenschap. Vervang de bestaande waarde door de map-id-waarde (tenant), zoals wordt weergegeven in de volgende afbeelding, omdat de app is geregistreerd bij de accounts in deze organisatiedirectory.

  3. Zoek in de aad.clientId eigenschap de tekenreeks {enter-your-client-id-here} en vervang de bestaande waarde door de toepassings-id -waarde (de clientId waarde) van de geregistreerde toepassing die is gekopieerd uit de Azure-portal.

    Schermopname met de app-id van een app die is geregistreerd bij Microsoft Entra ID in Azure Portal.

  4. Zoek in de aad.secret eigenschap de tekenreeks {enter-your-client-secret-here} en vervang de bestaande waarde door de sleutelwaarde die u hebt opgeslagen tijdens het maken van de app in Azure Portal.

De toepassing uitvoeren

  1. Zorg ervoor dat uw Tomcat-server wordt uitgevoerd en u beschikt over bevoegdheden voor het implementeren van een web-app. Zorg ervoor dat uw serverhostadres is http://localhost:8080.

  2. Compileer en verpakt het project met behulp van Maven:

    cd ~/javawebapp/2-Authorization-I/call-graph
    mvn clean package
    
  3. Zoek het resulterende WAR-bestand op ./target/msal4j-servlet-graph.war. Als u wilt implementeren naar Tomcat, kopieert u dit WAR-bestand naar de map /webapps/ in uw Tomcat-installatiemap en start u de Tomcat-server.

  4. Open uw browser en ga naar http://localhost:8080/msal4j-servlet-graph/. U wordt omgeleid om u aan te melden met Microsoft Entra ID. Als u zich hebt aangemeld, ziet u een pagina zoals hieronder:

    Schermopname van de gebruikersnaam die op de pagina wordt weergegeven nadat u zich hebt aangemeld bij de voorbeeldtoepassing.

  5. Selecteer de knop Details id-token om enkele van de gedecodeerde claims van het id-token weer te geven.

Overzicht van verificatiecode

U vindt de meeste verificatiecode in de voorbeeldtoepassing in de map van java/com/microsoft/azuresamples/msal4j/ het project. Het bevat meerdere servlets die de verificatie-eindpunten in de toepassing bieden voor het aanmelden, afmelden en verwerken van de omleidingsaanroep van Microsoft Entra-id. Deze servlets gebruiken de helperklassen in de directory java/com/microsoft/azuresamples/msal4j/helpers/ om de verificatiemethoden van MSAL aan te roepen. Er is een servlet-filter gedefinieerd waarin AuthenticationFilter.java niet-geverifieerde aanvragen worden omgeleid naar beveiligde routes naar een 401 niet-geautoriseerde HTTP-foutpagina.

Als u verificatie wilt toevoegen aan uw toepassing, moet u de servlet-klassen onder java/com/microsoft/azuresamples/msal4j/authservlets en java/com/microsoft/azuresamples/msal4j/authwebapp mappen, de helperklassen in de directory java/com/microsoft/azuresamples/msal4j/helpers/ en het verificatieservlet-filter AuthenticationFilter.java in uw projecten opnemen. Hier vindt u meer informatie over de MSAL-verificatiecode.

  1. MSAL4J is beschikbaar op Maven. U moet MSAL4J toevoegen als een afhankelijkheid in het pom.xml-bestand van het project:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.17.2</version>
    </dependency>
    
  2. De eerste stap van het aanmeldingsproces is het verzenden van een aanvraag naar het eindpunt van /authorize de Microsoft Entra-tenant. Het MSAL4J-exemplaar ConfidentialClientApplication wordt gebruikt om een AUTORISATIEaanvraag-URL te maken. De app leidt de browser om naar deze URL, waar de gebruiker zich aanmeldt. De volgende code is een fragment uit de implementatie van de redirectToAuthorizationEndpoint methode in de 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: Parameters die moeten worden ingesteld om een AuthorizationRequestUrl.
    • REDIRECT_URI: De omleidings-URI is de URI waar de id-provider de beveiligingstokens weer naar stuurt. Microsoft Entra ID leidt de browser , samen met verificatiecode, om naar deze URI na het verzamelen van gebruikersreferenties. Deze moet overeenkomen met de omleidings-URI in de registratie van de Microsoft Entra-app.
    • SCOPES: Bereiken zijn machtigingen die door de toepassing worden aangevraagd. Normaal gesproken zijn de drie bereiken openid profile offline_access voldoende voor het ontvangen van een id-tokenantwoord voor een gebruiker die zich aanmeldt en standaard worden ingesteld door MSAL.
  3. De gebruiker krijgt een aanmeldingsprompt van Microsoft Entra ID. Als de aanmeldingspoging is geslaagd, wordt de browser van de gebruiker omgeleid naar het omleidingseindpunt van onze app met een geldige autorisatiecode in het eindpunt. Het ConfidentialClientApplication exemplaar wisselt deze autorisatiecode vervolgens uit voor een id-token en toegangstoken van Microsoft Entra-id. De volgende code is een fragment uit de implementatie van de processAADCallback methode in de 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: Parameters die moeten worden ingesteld om de autorisatiecode voor een id en/of toegangstoken uit te wisselen.
    • authCode: De autorisatiecode die is ontvangen op het omleidingseindpunt.
    • REDIRECT_URI: De omleidings-URI die in de vorige stap is gebruikt, moet opnieuw worden doorgegeven.
    • SCOPES: De bereiken die in de vorige stap worden gebruikt, moeten opnieuw worden doorgegeven.
  4. Als acquireToken dit lukt, worden de tokenclaims geëxtraheerd. Als de nonce-controle is geslaagd, worden de resultaten geplaatst in context - een exemplaar van IdentityContextData - en opgeslagen in de sessie. De toepassing kan dit vervolgens instantiëren vanuit de sessie, door middel van een exemplaar van IdentityContextAdapterServlet : wanneer deze toegang nodig heeft:

    // 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());