Condividi tramite


Proteggere le applicazioni WebSphere Liberty/Open Liberty con Microsoft Entra ID con OpenID Connect

Questo articolo illustra come proteggere le applicazioni IBM WebSphere Liberty/Open Liberty con Microsoft Entra ID usando OpenID Connect (OIDC).

In questo articolo vengono illustrate le operazioni seguenti:

  • Configurare un provider OIDC con Microsoft Entra ID.
  • Proteggere un'app WebSphere Liberty/Open Liberty usando OIDC.
  • Eseguire e testare l'app WebSphere Liberty/Open Liberty.

Prerequisiti

Configurare un provider OIDC con Microsoft Entra ID

OpenID Connect è un protocollo di autenticazione standard di settore ben supportato da Microsoft Entra ID. In questa sezione viene configurato un provider OIDC con Microsoft Entra ID da usare con l'app WebSphere Liberty/Open Liberty. In una sezione successiva si configura l'app WebSphere Liberty/Open Liberty usando OIDC per autenticare e autorizzare gli utenti nel tenant di Microsoft Entra.

Creare utenti nel tenant di Microsoft Entra

Prima di tutto, creare due utenti nel tenant di Microsoft Entra seguendo la procedura descritta in Come creare, invitare ed eliminare utenti. È sufficiente la sezione Crea un nuovo utente . Usare le istruzioni seguenti durante l'articolo, quindi tornare a questo articolo dopo aver creato gli utenti nel tenant di Microsoft Entra.

Per creare un utente da usare come "amministratore" nell'app, seguire questa procedura:

  1. Quando si raggiunge la scheda Informazioni di base nella sezione Crea un nuovo utente , seguire questa procedura:
    1. Per Nome entità utente immettere admin. Salvare il valore in modo da poterlo usare in un secondo momento quando si accede all'app.

    2. Per Nome alternativo posta selezionare Deriva dal nome dell'entità utente

    3. Per Nome visualizzato immettere Admin.

    4. Per Password selezionare Genera automaticamente la password. Copiare e salvare il valore password da usare in un secondo momento quando si accede all'app.

    5. Selezionare Account abilitato.

      Screenshot del portale di Azure che mostra il riquadro Crea nuovo utente Informazioni di base per un utente amministratore.

    6. Selezionare Rivedi e crea>Crea. Attendere fino a quando l'utente non viene creato.

    7. Attendere un minuto o così via e selezionare Aggiorna. Verrà visualizzato il nuovo utente nell'elenco.

Per creare un utente da usare come "utente" nell'app, ripetere questi passaggi, ma usare i valori seguenti:

  • In Nome entità utente immettere user.
  • In Nome visualizzato immettere User.

Screenshot del portale di Azure che mostra il riquadro Crea nuovo utente Informazioni di base per un utente normale.

Registrare un’applicazione in Microsoft Entra ID

Registrare quindi un'applicazione seguendo la procedura descritta in Avvio rapido: Registrare un'applicazione con Microsoft Identity Platform. Usare le istruzioni seguenti durante l'articolo, quindi tornare a questo articolo dopo la registrazione e la configurazione dell'applicazione.

  1. Quando si raggiunge la sezione Registra un'applicazione , seguire questa procedura:
    1. Per Tipi di account supportati selezionare Account solo in questa directory organizzativa (solo directory predefinita - Tenant singolo).
    2. Al termine della registrazione, salvare i valori ID applicazione (client) e ID directory (tenant) da usare in un secondo momento nella configurazione dell'app.
  2. Quando si raggiunge la sezione Aggiungi un URI di reindirizzamento, ignorare i passaggi per il momento. Aggiungere l'URI di reindirizzamento in un secondo momento quando si esegue e si testa l'app di esempio in locale in questo articolo.
  3. Quando si raggiunge la sezione Aggiungi credenziali , selezionare la scheda Aggiungi un segreto client.
  4. Quando si aggiunge un segreto client, annotare il valore del segreto client da usare in un secondo momento nella configurazione dell'app.

Aggiungere i ruoli dell'app all'applicazione

Aggiungere quindi i ruoli dell'app all'applicazione seguendo la procedura descritta in Aggiungere ruoli dell'app all'applicazione e riceverli nel token. Sono necessarie solo le sezioni Dichiarare i ruoli per un'applicazione e Assegnare utenti e gruppi ai ruoli di Microsoft Entra. Usare le istruzioni seguenti durante l'articolo, quindi tornare a questo articolo dopo aver dichiarato i ruoli per l'applicazione.

  1. Quando si raggiunge la sezione Dichiara ruoli per un'applicazione , usare l'interfaccia utente Ruoli app per creare ruoli per l'amministratore e l'utente normale.

    1. Creare un ruolo utente amministratore usando i valori seguenti:

      • Per Nome visualizzato immettere Admin.
      • In Tipi di membri consentiti selezionare Utenti/Gruppi.
      • Per Valore immettere admin.
      • Per Descrizione immettere Admin.For Description, enter Admin.
      • Selezionare Vuoi abilitare questo ruolo dell'app?

      Screenshot del portale di Azure che mostra il riquadro Crea ruolo app per l'utente amministratore.

    2. Selezionare Applica. Attendere la creazione del ruolo.

    3. Creare un ruolo utente normale usando gli stessi passaggi, ma con i valori seguenti:

      • In Nome visualizzato immettere User.
      • In Valore immettere user.
      • Per Descrizione immettere User.

      Screenshot del portale di Azure che mostra il riquadro Crea ruolo app per l'utente normale.

  2. Quando si raggiunge la sezione Assegnare utenti e gruppi ai ruoli di Microsoft Entra, seguire questa procedura:

    1. Selezionare Aggiungi utente/gruppo.

    2. Nel riquadro Aggiungi assegnazione selezionare Amministratore utente e selezionare Amministratore ruolo per Selezionare un ruolo. Selezionare quindi Assegna. Attendere che l'assegnazione dell'applicazione abbia esito positivo. Potrebbe essere necessario scorrere la tabella lateralmente per visualizzare la colonna Role assigned .

    3. Ripetere i passaggi precedenti per assegnare il ruolo Utente all'utente.

    4. Selezionare Aggiorna e verranno visualizzati gli utenti e i ruoli assegnati nel riquadro Utenti e gruppi .

      Screenshot del portale di Azure che mostra gli utenti e i ruoli assegnati.

      Potrebbe essere necessario modificare la larghezza delle intestazioni di colonna per fare in modo che la visualizzazione sia simile all'immagine.

Non seguire altri passaggi in Aggiungere ruoli dell'app all'applicazione e riceverli nel token.

Proteggere un'app WebSphere Liberty/Open Liberty usando OpenID Connect

In questa sezione viene protetta un'app WebSphere Liberty/Open Liberty che autentica e autorizza gli utenti nel tenant di Microsoft Entra usando OIDC. Si apprenderà anche come concedere agli utenti l'accesso a determinate parti dell'app usando il controllo degli accessi in base al ruolo. L'app usa la configurazione dei criteri di sicurezza a livello di codice della specifica Jakarta Servlet. Jakarta EE supporta anche i servizi Web RESTful. Vedere la sezione Passaggi successivi per un riferimento a un articolo sulla protezione di un'applicazione di servizi Web RESTful.

L'app WebSphere Liberty/Open Liberty di esempio per questa guida introduttiva è disponibile in GitHub nel repository liberty-entra-id .

Abilitare l'autenticazione e l'autorizzazione per proteggere l'app

L'app ha una risorsa della pagina iniziale definita in index.html, come illustrato nel codice di esempio seguente. Questa pagina è accessibile agli utenti non autenticati. Il percorso radice della pagina di benvenuto si trova in /.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Greeting</title>
</head>
<body>
<h1>Hello, welcome to Open Liberty/WebSphere Liberty and Microsoft Entra ID integration!</h1>
<h1>
    <a href="/profile/user">Sign in as user</a>
</h1>
<h1>
    <a href="/profile/admin">Sign in as admin</a>
</h1>
</body>
</html>

Dalla pagina iniziale gli utenti possono accedere all'app per accedere alla pagina del profilo. La pagina iniziale contiene collegamenti per accedere come utente o come amministratore. I collegamenti si trovano rispettivamente in /profile/user e /profile/admin.

Entrambi /profile/user i collegamenti e /profile/admin puntano al servlet del profilo, definito in ProfileServlet.java, come illustrato nel codice di esempio seguente. Questo servlet è accessibile solo agli utenti autenticati usando l'annotazione jakarta.servlet.annotation.ServletSecurity e l'annotazione jakarta.servlet.annotation.HttpConstraint. L'attributo rolesAllowed = {"users"} specifica che solo gli utenti autenticati con ruolo users di sicurezza possono accedere al /profile percorso. All'utente autenticato viene assegnato automaticamente il users ruolo nel file di configurazione Liberty server.xml.

package com.example;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.HttpConstraint;
import jakarta.servlet.annotation.ServletSecurity;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

import com.ibm.websphere.security.social.UserProfileManager;
import java.util.List;

@WebServlet(name = "ProfileServlet", urlPatterns = {"/profile/user","/profile/admin"})
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"users"},
        transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL))
public class ProfileServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        List<?> roles = UserProfileManager.getUserProfile().getIdToken().getClaims().getClaim("roles",
                List.class);

        String path = request.getServletPath();
        if (path.equals("/profile/admin") && (null == roles || !roles.contains("admin"))) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN);
            return;
        }

        String username = request.getUserPrincipal().getName();
        request.setAttribute("name", username);
        request.setAttribute("roles", roles);

        request
                .getRequestDispatcher("/profile.jsp")
                .forward(request, response);
    }
}

Il servlet del profilo recupera i ruoli dell'utente dal token ID e verifica se l'utente ha il admin ruolo quando l'utente tenta di accedere al /profile/admin percorso. Se l'utente non ha il admin ruolo, il servlet restituisce un errore 403 Accesso negato. In altri casi, il servlet recupera il nome dell'utente e inoltra la richiesta alla pagina del profilo con il nome e i ruoli dell'utente.

La pagina del profilo è definita in profile.jsp, come illustrato nell'esempio seguente. In questa pagina vengono visualizzati il nome e i ruoli dell'utente. La pagina del profilo ha anche un collegamento di disconnessione all'indirizzo /logout. La pagina del profilo è scritta da JSP (Jakarta Server Pages). Si noti l'uso di ${} espressioni nella pagina. ${} Indica l'uso di Jakarta Expression Language (EL). Le espressioni EL vengono sostituite con i valori delle variabili corrispondenti quando viene eseguito il rendering della pagina. Vedere la sezione Passaggi successivi per un riferimento alla specifica EL.

<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
    <meta charset="UTF-8">
    <title>Profile</title>
</head>
<body>
<h1>Hello, ${name}</h1>
<h2>Roles</h2>
<ul>
    <c:forEach var="role" items="${roles}">
        <li>${role}</li>
    </c:forEach>
</ul>
<h1>
    <b><a href="/logout">Sign out</a></b>
</h1>
</body>
</html>

Quando l'utente seleziona il collegamento per disconnettersi, l'app chiama il servlet di disconnessione, definito in LogoutServlet.java, come illustrato nel codice di esempio seguente. Il servlet di disconnessione chiama il request.logout() metodo per disconnettere l'utente e quindi reindirizza l'utente alla pagina di benvenuto.

package com.example;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.HttpConstraint;
import jakarta.servlet.annotation.ServletSecurity;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "LogoutServlet", urlPatterns = "/logout")
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"users"},
        transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL))
public class LogoutServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        request.logout();
        response.sendRedirect("/");
    }
}

Eseguire e testare l'app WebSphere Liberty/Open Liberty

In questa sezione si esegue e si testa l'app WebSphere Liberty/Open Liberty per vedere come funziona con Microsoft Entra ID come provider OIDC.

Aggiungere un URI di reindirizzamento alla registrazione dell'app

Per eseguire e testare correttamente l'app in locale, è necessario aggiungere un URI di reindirizzamento alla registrazione dell'app. Seguire le istruzioni nella sezione Aggiungere un URI di reindirizzamento di Avvio rapido: Registrare un'applicazione con Microsoft Identity Platform e usare i valori seguenti:

  • Per Configura piattaforme selezionare Web.
  • Per URI di reindirizzamento immettere https://localhost:9443/ibm/api/social-login/redirect/liberty-entra-id.

Preparare l'esempio

Usare la procedura seguente per preparare l'app di esempio:

  1. Usare i comandi seguenti per clonare l'app di esempio da GitHub:

    git clone https://github.com/Azure-Samples/liberty-entra-id
    cd liberty-entra-id
    git checkout 2024-09-26
    

    Se viene visualizzato un messaggio relativo allo stato di detached HEAD, questo messaggio è sicuro da ignorare. Questo messaggio significa semplicemente che è stato estratto un tag.

  2. Usare i comandi seguenti per definire le variabili di ambiente seguenti con i valori annoti in precedenza:

    export CLIENT_ID==<application/client-ID>
    export CLIENT_SECRET=<client-secret>
    export TENANT_ID=<directory/tenant-ID>
    

    Queste variabili di ambiente forniscono i valori per il supporto predefinito di OIDC in WebSphere Liberty/Open Liberty. La configurazione OIDC corrispondente nell'server.xml Liberty è illustrata nell'esempio seguente.

     <oidcLogin
         id="liberty-entra-id" clientId="${client.id}"
         clientSecret="${client.secret}"
         discoveryEndpoint="https://login.microsoftonline.com/${tenant.id}/v2.0/.well-known/openid-configuration"
         signatureAlgorithm="RS256"
         userNameAttribute="preferred_username" />
    

    Se il valore di una variabile non è definito nel file di configurazione, WebSphere Liberty/Open Liberty legge il valore dalle variabili di ambiente seguendo la relativa convenzione di denominazione. Per informazioni dettagliate sulla conversione dei nomi, vedere Precedenza di sostituzione delle variabili.

Eseguire l'app WebSphere Liberty/Open Liberty

È possibile eseguire l'app usando liberty-maven-plugin. Per eseguire l'app, selezionare uno dei metodi seguenti:

Nota

Per consentire a WebSphere Liberty/Open Liberty di connettersi a Microsoft Entra ID, assicurarsi di eseguire il comando nella shell in cui sono state definite le variabili di ambiente illustrate nella sezione precedente.

  • Eseguire l'app in modalità di sviluppo:

    mvn liberty:dev
    
  • Eseguire l'app in modalità di runtime:

    mvn liberty:run
    

Se vuoi provare modalità diverse, usa CTRL+C per arrestare l'app e quindi eseguirla in un'altra modalità.

Testare l'app WebSphere Liberty/Open Liberty

Dopo l'esecuzione dell'app, aprire un Web browser con una scheda privata e passare a https://localhost:9443. Poiché il certificato è autofirmato, potrebbe essere visualizzato un avviso relativo al certificato. È possibile ignorare l'avviso e procedere al sito.

Verrà visualizzata la pagina iniziale con collegamenti per accedere come utente o come amministratore. L'uso di una scheda privata consente di evitare di inquinare qualsiasi attività esistente di Microsoft Entra ID nel browser normale.

Screenshot dell'applicazione di esempio che mostra la pagina iniziale.

Raccogliere le credenziali per i due utenti

In questo articolo, Microsoft Entra ID usa l'indirizzo di posta elettronica di ogni utente come ID utente per l'accesso. Usare la procedura seguente per ottenere l'indirizzo di posta elettronica per l'utente amministratore e l'utente normale:

  1. Accedere all'Interfaccia di amministrazione di Microsoft Entra almeno come Amministratore applicazione cloud.
  2. Se si ha accesso a più tenant, usare l'icona Impostazioni ( ) nel menu in alto per passare al tenant in cui si vuole registrare l'applicazione dal menu Directory e sottoscrizioni.
  3. Passare a Identity Users All Users .Browse to >.
  4. Individuare l'utente amministratore nell'elenco e selezionarlo.
  5. Individuare il campo Nome entità utente.
  6. Usare l'icona di copia accanto al valore del campo per salvare l'indirizzo di posta elettronica dell'utente negli Appunti. Salvare il valore per usarlo in un secondo momento.
  7. Per ottenere l'indirizzo di posta elettronica per l'utente normale, seguire la stessa procedura.

Usare le password per l'utente amministratore e l'utente normale impostati durante la creazione degli utenti.

Esercizio della funzionalità dell'app

Per eseguire l'esercizio delle funzionalità, seguire questa procedura:

  1. Selezionare il collegamento Accedi come utente . Accedere con l'utente normale creato in precedenza. Dopo l'accesso, Microsoft Entra ID reindirizza l'utente alla pagina del profilo, in cui vengono visualizzati il nome e i ruoli.

    Screenshot dell'applicazione di esempio che mostra il profilo utente.

  2. Se è la prima volta che si accede, viene richiesto di aggiornare la password. Seguire le istruzioni per aggiornare la password.

  3. Se viene richiesto all'organizzazione sono necessarie informazioni di sicurezza aggiuntive. Seguire le istruzioni per scaricare e configurare l'app Microsoft Authenticator, è possibile selezionare Chiedi in un secondo momento per continuare il test.

  4. Se viene richiesto l'opzione Autorizzazioni, esaminare le autorizzazioni richieste dall'app. Selezionare Accetta per continuare il test.

  5. Selezionare Disconnetti per disconnettersi dall'app. Dopo la disconnessione, si viene reindirizzati alla pagina di benvenuto.

  6. Selezionare il collegamento Accedi come amministratore . Microsoft Entra ID reindirizza l'utente alla pagina di accesso. Accedere con l'utente amministratore creato in precedenza. Dopo l'accesso, Microsoft Entra ID reindirizza l'utente alla pagina del profilo simile, con un ruolo admindiverso.

    Screenshot dell'applicazione di esempio che mostra il profilo di amministratore.

  7. Disconnettersi di nuovo e provare ad accedere come amministratore con l'utente normale creato in precedenza. Verrà visualizzato un messaggio di errore perché l'utente normale non ha il admin ruolo.

    Screenshot dell'applicazione di esempio che mostra il messaggio di accesso negato.

Pulire le risorse

Questo articolo non indirizza la distribuzione dell'app in Azure. Non ci sono risorse di Azure da pulire per l'app, anche se sono presenti risorse id Microsoft Entra. Per distribuire un'app in Azure, è possibile seguire le indicazioni a cui si fa riferimento nella sezione successiva.

Al termine delle risorse per questa app di esempio, seguire questa procedura per pulire le risorse di Microsoft Entra ID. La rimozione delle risorse microsoft Entra ID inutilizzate è una procedura consigliata importante per la sicurezza.

  1. Rimuovere la registrazione dell'app creata seguendo la procedura descritta in Rimuovere un'applicazione registrata con Microsoft Identity Platform. È sufficiente seguire la procedura descritta nella sezione Rimuovere un'applicazione creata dall'organizzazione.
  2. L'atto di rimuovere la registrazione dell'app deve anche eliminare l'applicazione aziendale. Per altre informazioni sull'eliminazione di applicazioni aziendali, vedere Eliminare un'applicazione aziendale.
  3. Eliminare gli utenti creati seguendo la procedura descritta in Come creare, invitare ed eliminare utenti.

Passaggi successivi

In questa guida introduttiva si proteggono le applicazioni WebSphere Liberty/Open Liberty con Microsoft Entra ID usando OIDC. Per altre informazioni, esplorare le risorse seguenti: