Compartir a través de


Habilitación del inicio de sesión para aplicaciones de WebSphere de Java mediante Microsoft Entra ID

En este ejemplo se muestra una aplicación de WebSphere de Java que inicia sesión de los usuarios en el inquilino de Microsoft Entra ID mediante la Biblioteca de autenticación de Microsoft (MSAL) para Java.

En el siguiente diagrama se muestra la topología de la aplicación:

Diagrama que muestra la topología de la aplicación.

La aplicación cliente usa MSAL para Java (MSAL4J) para iniciar sesión de usuarios en un inquilino de Microsoft Entra ID y obtener un token de identificador de Microsoft Entra ID. El token de identificador demuestra que un usuario está autenticado con este inquilino. La aplicación protege sus rutas según el estado de autenticación del usuario.

Requisitos previos

  • JDK versión 8 o posterior
  • Maven 3
  • Un inquilino de Microsoft Entra ID. Para obtener más información, consulte Cómo obtener un inquilino de Microsoft Entra ID.
  • Una cuenta de usuario en su propio inquilino de Microsoft Entra ID si desea trabajar solo con cuentas en el directorio organizativo, es decir, modo de inquilino único. Si aún no ha creado una cuenta de usuario en el inquilino de Microsoft Entra ID, debe hacerlo antes de continuar. Para obtener más información, consulte Cómo crear, invitar y eliminar usuarios.
  • Una cuenta de usuario en el inquilino de Microsoft Entra ID de cualquier organización si desea trabajar con cuentas en cualquier directorio organizativo, es decir, en modo multiinquilino. Debe modificar este ejemplo para trabajar con una cuenta Microsoft personal. Si aún no ha creado una cuenta de usuario en el inquilino de Microsoft Entra ID, debe hacerlo antes de continuar. Para obtener más información, consulte Cómo crear, invitar y eliminar usuarios.
  • Una cuenta de Microsoft personal (por ejemplo, Xbox, Hotmail, Live, etc.) si desea trabajar con cuentas personales de Microsoft.

Recomendaciones

Configuración del ejemplo

En las secciones siguientes se muestra cómo configurar la aplicación de ejemplo.

Clonación o descarga del repositorio de ejemplo

Para clonar el ejemplo, abra una ventana de Bash y use el siguiente comando:

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

Como alternativa, vaya al repositorio ms-identity-msal-java-samples y, a continuación, descárguelo como un archivo .zip y extráigalo en el disco duro.

Importante

Para evitar las limitaciones de longitud de la ruta de los archivos en Windows, clone o extraiga el repositorio en un directorio cerca de la raíz del disco duro.

Registro de la aplicación de ejemplo con el inquilino de Microsoft Entra ID

En este ejemplo hay un proyecto. En esta sección se muestra cómo registrar la aplicación.

En primer lugar, registre la aplicación en Azure Portal siguiendo las instrucciones de Inicio rápido: Registro de una aplicación en la plataforma de identidades de Microsoft.

A continuación, siga estos pasos para completar el registro:

  1. Vaya a la página de Registros de aplicaciones de la plataforma de identidad de Microsoft para desarrolladores.

  2. Seleccione Nuevo registro.

  3. En la página Registrar una aplicación que aparece, escriba la siguiente información de registro de la aplicación:

    • En la sección Nombre, escriba un nombre significativo de la aplicación, que se mostrará a los usuarios de la aplicación, por ejemplo, java-servlet-webapp-authentication.

    • En Tipos de cuenta admitidos, seleccione una de las siguientes opciones:

      • Seleccione Solo las cuentas de este directorio organizativo si va a crear una aplicación para que solo la utilicen los usuarios de su inquilino, es decir, una aplicación de inquilino.
      • Seleccione Cuentas de cualquier directorio de la organización si desea que los usuarios de cualquier inquilino de Microsoft Entra ID puedan usar su aplicación, es decir, una aplicación multiinquilino.
      • Seleccione Cuentas de un directorio organizativo y cuentas de Microsoft personales para el conjunto más amplio de clientes, es decir, una aplicación multiinquilino que también admite cuentas personales de Microsoft.
      • Seleccione Cuentas personales de Microsoft para que solo las utilicen los usuarios de cuentas Microsoft personales (por ejemplo, cuentas de Hotmail, Live, Skype o Xbox).
    • En la sección URI de redirección, seleccione Web en el cuadro combinado y escriba los siguientes URI de redirección: http://localhost:8080/msal4j-servlet-auth/auth/redirect.

  4. Seleccione Registrar para crear la aplicación.

  5. En la página de registro de la aplicación, busque y copie el valor del identificador de la aplicación (cliente) para usarlo más adelante. Este valor se usa en el archivo o los archivos de configuración de la aplicación.

  6. En la página de registro de la aplicación, seleccione Certificados y secretos en el panel de navegación para abrir la página para generar secretos y cargar certificados.

  7. En la sección Secretos de cliente, seleccione Nuevo secreto de cliente.

  8. Escriba una descripción, por ejemplo, secreto de aplicación.

  9. Seleccione una de las duraciones disponibles: En 1 año, En 2 años o No caduca nunca.

  10. Seleccione Agregar. Se muestra el valor generado.

  11. Copie y guarde el valor generado para usarlo en pasos posteriores. Necesita este valor para los archivos de configuración del código. Este valor no volverá a aparecer y no podrá recuperarlo por ningún otro medio. Por lo tanto, asegúrese de guardarlo desde Azure Portal antes de navegar a cualquier otra pantalla o panel.


Configuración de la aplicación para usar el registro de su aplicación

Siga estos pasos para configurar la aplicación:

Nota:

En los pasos siguientes, ClientID es igual que Application ID o AppId.

  1. Abra el proyecto en su IDE.

  2. Abra el archivo ./src/main/resources/authentication.properties.

  3. Busque la cadena {enter-your-tenant-id-here}. Reemplace el valor existente por uno de los siguientes valores:

    • El identificador de inquilino de Microsoft Entra ID si registró la aplicación con la opción Solo cuentas de este directorio organizativo.
    • La palabra organizations si registró la aplicación con la opción Cuentas de cualquier directorio organizativo.
    • La palabra common si registró la aplicación con la opción Cuentas de cualquier directorio organizativo y cuentas de Microsoft personales.
    • La palabra consumers si registró la aplicación con la opción Cuentas personales de Microsoft.
  4. Busque la cadena {enter-your-client-id-here} y reemplace el valor existente por el identificador de aplicación o clientId de la aplicación java-servlet-webapp-authentication que ha copiado de Azure Portal.

  5. Busque la cadena {enter-your-client-secret-here} y reemplace el valor existente por el valor que ha guardado durante la creación de la aplicación java-servlet-webapp-authentication en Azure Portal.

Compilación del ejemplo

Para crear el ejemplo mediante Maven, vaya al directorio que contiene el archivo pom.xml del ejemplo y, a continuación, ejecute el siguiente comando:

mvn clean package

Este comando genera un archivo .war que se puede ejecutar en varios servidores de aplicaciones.

Ejecución del ejemplo

En estas instrucciones se supone que instaló WebSphere y configuró un servidor. Puede usar las instrucciones de Implementación de un clúster de WebSphere Application Server (tradicional) en Azure Virtual Machines para una configuración básica del servidor.

Para poder realizar la implementación en WebSphere, siga estos pasos para realizar algunos cambios de configuración en el propio ejemplo y, a continuación, compile o vuelva a compilar el paquete:

  1. Vaya al archivo authentication.properties de la aplicación y cambie el valor de app.homePage a la dirección URL del servidor y el número de puerto que tiene previsto usar, como se muestra en el ejemplo siguiente:

    # app.homePage is by default set to dev server address and app context path on the server
    # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net
    app.homePage=https://<server-url>:<port-number>/msal4j-servlet-auth/
    
  2. Después de guardar este archivo, use el siguiente comando para volver a compilar la aplicación:

    mvn clean package
    
  3. Una vez que el código termine de compilarse, copie el archivo .war del sistema de archivos del servidor de destino.

También debe realizar el mismo cambio en el registro de aplicaciones de Azure, donde lo estableció en Azure Portal como valor URI de redirección en la pestaña Autenticación.

  1. Vaya a la página de Registros de aplicaciones de la plataforma de identidad de Microsoft para desarrolladores.

  2. Use el recuadro de búsqueda para buscar el registro de la aplicación; por ejemplo, java-servlet-webapp-authentication.

  3. Para abrir el registro de la aplicación, seleccione el nombre.

  4. Seleccione Autenticar desde el menú.

  5. En la sección Web - URIs de redireccionamiento, seleccione Agregar URI.

  6. Rellene el URI de la aplicación, anexando /auth/redirect, por ejemplo, https://<server-url>:<port-number>/auth/redirect.

  7. Seleccione Guardar.

Siga estos pasos para implementar el ejemplo mediante la consola de soluciones integradas de WebSphere:

  1. En la pestaña Aplicaciones, seleccione Nueva aplicación y, a continuación, Nueva aplicación empresarial.

  2. Elija el archivo .war que ha compilado y, después, seleccione Siguiente hasta llegar al paso de instalación Asignar raíces de contexto para módulos web. La otra configuración predeterminada debe ser correcta.

  3. Para la raíz del contexto, establézcalo en el mismo valor que después del número de puerto en el "URI de redirección" establecido en la configuración de ejemplo o registro de aplicaciones de Azure. Es decir, si el URI de redirección es http://<server-url>:9080/msal4j-servlet-auth/, la raíz del contexto debe ser msal4j-servlet-auth.

  4. Seleccione Finalizar.

  5. Una vez finalizada la instalación de la aplicación, vaya a la sección Aplicaciones empresariales de WebSphere de la pestaña Aplicaciones.

  6. Seleccione el archivo .war que instaló de la lista de aplicaciones y, a continuación, seleccione Iniciar para implementar.

  7. Una vez finalizada la implementación, vaya a http://<server-url>:9080/{whatever you set as the context root} y debería poder ver la aplicación.

Exploración del ejemplo

Siga estos pasos para explorar el ejemplo:

  1. Observe que el estado de inicio de sesión o de cierre de sesión se muestra en el centro de la pantalla.
  2. Seleccione el botón contextual en la esquina. Este botón indica Iniciar sesión cuando se ejecuta por primera vez la aplicación.
  3. En la página siguiente, siga las instrucciones e inicie sesión con una cuenta en el inquilino de Microsoft Entra ID.
  4. En la pantalla de consentimiento, observe los ámbitos que se solicitan.
  5. Observe que el botón contextual ahora indica Cerrar sesión y muestra el nombre de usuario.
  6. Seleccione Detalles del token de identificador para ver algunas de las notificaciones descodificadas del token de identificador.
  7. Use el botón de la esquina para cerrar la sesión.
  8. Después de cerrar sesión, seleccione Detalles del token de identificador para observar que la aplicación muestra un error 401: unauthorized en lugar de las notificaciones del token de identificador cuando el usuario no está autorizado.

Sobre el código

En este ejemplo se muestra cómo usar MSAL para Java (MSAL4J) para iniciar sesión de los usuarios en el inquilino de Microsoft Entra ID. Si quiere usar MSAL4J en sus propias aplicaciones, debe agregarlo a los proyectos mediante Maven.

Si desea replicar el comportamiento de este ejemplo, puede copiar el archivo pom.xml y el contenido de las carpetas helpers y authservlets en la carpeta src/main/java/com/microsoft/azuresamples/msal4j. También necesita el archivo authentication.properties. Estas clases y archivos contienen código genérico que puede usar en una amplia gama de aplicaciones. También puede copiar el resto del ejemplo, pero las demás clases y archivos se compilan específicamente para abordar el objetivo de este ejemplo.

Contenido

En la tabla siguiente se muestra el contenido de la carpeta del proyecto de ejemplo:

Archivo/carpeta Descripción
src/main/java/com/microsoft/azuresamples/msal4j/authwebapp/ Este directorio contiene las clases que definen la lógica empresarial de back-end de la aplicación.
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ Este directorio contiene las clases que se usan para los puntos de conexión de inicio de sesión y cierre de sesión.
____Servlet.java Todos los puntos de conexión disponibles se definen en clases .java que terminan en ____Servlet.java.
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ Clases auxiliares para la autenticación.
AuthenticationFilter.java Redirige las solicitudes no autenticadas a los puntos de conexión protegidos a una página 401.
src/main/resources/authentication.properties Microsoft Entra ID y configuración del programa.
src/main/webapp/ Este directorio contiene la interfaz de usuario: plantillas de JSP
CHANGELOG.md Lista de cambios en la muestra.
CONTRIBUTING.md Directrices para contribuir al ejemplo.
LICENCIA Licencia del ejemplo.

ConfidentialClientApplication

Se crea una instancia de ConfidentialClientApplication en el archivo AuthHelper.java, como se muestra en el ejemplo siguiente. Este objeto ayuda a crear la dirección URL de autorización de Microsoft Entra ID y también ayuda a intercambiar el token de autenticación de un token de acceso.

// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                     .builder(CLIENT_ID, secret)
                     .authority(AUTHORITY)
                     .build();

Para la instanciación se utilizan los siguientes parámetros:

  • El identificador de cliente de la aplicación.
  • El secreto de cliente, que es un requisito para aplicaciones cliente confidenciales.
  • Microsoft Entra ID Authority, que incluye el identificador de inquilino de Microsoft Entra ID.

En este ejemplo, estos valores se leen del archivo authentication.properties mediante un lector de propiedades del archivo Config.java.

Tutorial paso a paso

Los pasos siguientes proporcionan un tutorial de la funcionalidad de la aplicación:

  1. El primer paso del proceso de inicio de sesión consiste en enviar una solicitud al punto de conexión /authorize del inquilino de Microsoft Entra ID. La instancia ConfidentialClientApplication de MSAL4J se usa para construir una dirección URL de solicitud de autorización. La aplicación redirige el explorador a esta dirección URL, que es donde el usuario inicia sesión.

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

    En la lista siguiente se describen las características de este código:

    • AuthorizationRequestUrlParameters: parámetros que se deben establecer para crear una instancia de AuthorizationRequestUrl.

    • REDIRECT_URI: donde Microsoft Entra ID redirige el navegador, junto con el código de autenticación, después de recopilar las credenciales de usuario. Debe coincidir con el URI de redireccionamiento en el registro de la aplicación Microsoft Entra ID en Azure Portal.

    • SCOPES: Los ámbitos son permisos solicitados por la aplicación. Normalmente, los tres ámbitos openid profile offline_access son suficientes para recibir una respuesta de token de identificador.

      Puede encontrar una lista completa de ámbitos solicitados por la aplicación en el archivo authentication.properties. Puede agregar más ámbitos, como User.Read.

  2. Microsoft Entra ID presenta al usuario un mensaje de inicio de sesión. Si el intento de inicio de sesión es correcto, el navegador del usuario se vuelve a redirigir al punto de conexión de redirección de la aplicación. Una solicitud válida a este punto de conexión contendrá un código de autorización.

  3. Después, la instancia de ConfidentialClientApplication intercambia este código de autorización por un token de identificador y un token de acceso de Microsoft Entra ID.

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

    En la lista siguiente se describen las características de este código:

    • AuthorizationCodeParameters: parámetros que se deben establecer para intercambiar el código de autorización por un identificador o token de acceso.
    • authCode: el código de autorización que se ha recibido en el punto de conexión de redireccionamiento.
    • REDIRECT_URI: el URI de redireccionamiento que se ha usado en el paso anterior se debe pasar de nuevo.
    • SCOPES: los ámbitos que se han usado en el paso anterior se deben pasar de nuevo.
  4. Si acquireToken se realiza correctamente, se extraen las notificaciones de token. Si se supera la comprobación nonce, los resultados se colocan en context, una instancia de IdentityContextData, y se guardan en la sesión. Después, la aplicación puede crear una instancia de IdentityContextData a partir de la sesión por medio de una instancia de IdentityContextAdapterServlet siempre que necesite acceder a ella, como se muestra en el código siguiente:

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

Protección de las rutas

Para obtener información sobre cómo la aplicación de ejemplo filtra el acceso a las rutas, consulte AuthenticationFilter.java. En el archivo authentication.properties, la propiedad app.protect.authenticated contiene las rutas separadas por comas a las que solo pueden acceder los usuarios autenticados, como se muestra en el ejemplo siguiente:

# for example, /token_details requires any user to be signed in and does not require special roles claim(s)
app.protect.authenticated=/token_details

Ámbitos

Los ámbitos indican a Microsoft Entra ID el nivel de acceso que solicita la aplicación.

En función de los ámbitos solicitados, Microsoft Entra ID presenta un cuadro de diálogo de consentimiento al usuario cuando inicia sesión. Si el usuario da su consentimiento para uno o varios ámbitos y obtiene un token, los ámbitos con consentimiento se codifican en el access_token resultante.

Para los ámbitos solicitados por la aplicación, consulte authentication.properties. MSAL solicita estos tres ámbitos y se proporcionan de forma predeterminada por Microsoft Entra ID.

Más información

Paso siguiente

Implementación de aplicaciones de Java WebSphere en WebSphere tradicional en Azure Virtual Machines