Compartir a través de


Habilitación del inicio de sesión para aplicaciones WebLogic de Java mediante MSAL4J con Azure Active Directory B2C

En este artículo se muestra una aplicación Servlet de Java que autentica a los usuarios en Azure Active Directory B2C (Azure AD B2C) mediante la Biblioteca de autenticación de Microsoft para Java (MSAL4J).

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

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

La aplicación usa MSAL4J para iniciar sesión de los usuarios y obtener un token de identificador de Azure AD B2C. El token de identificador demuestra que el usuario se autentica en un inquilino de Azure AD B2C.

Requisitos previos

Recomendaciones

  • Cierta familiaridad con los Servlets de Java /Jakarta.
  • Cierta familiaridad con el terminal Linux/OSX o Windows PowerShell.
  • jwt.ms para inspeccionar los tokens.
  • Fiddler para supervisar la actividad de red y la solución de problemas.
  • Siga el blog de Microsoft Entra ID para mantenerse al día con los últimos desarrollos.

Configuración del ejemplo

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

Clonar o descargar el 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-b2c

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 limitaciones de longitud de ruta de acceso de archivo 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 Azure AD B2C

El ejemplo incluye una aplicación registrada previamente con fines de prueba. Si desea usar su propio inquilino y aplicación de Azure AD B2C, siga los pasos descritos en las secciones siguientes para registrar y configurar la aplicación en Azure Portal. De lo contrario, continúe con los pasos para Ejecutar el ejemplo.

Elija el inquilino de Azure AD B2C donde desea crear las aplicaciones.

Para elegir el inquilino, siga estos pasos:

  1. Inicie sesión en Azure Portal.

  2. Si la cuenta está presente en más de un inquilino de Azure AD B2C, seleccione el perfil en la esquina de Azure Portal y, a continuación, seleccione Cambiar directorio para cambiar la sesión al inquilino de Azure AD B2C deseado.

Creación de flujos de usuario y directivas personalizadas

Para crear flujos de usuario comunes, como el registro, el inicio de sesión, la edición de perfiles y el restablecimiento de contraseña, consulte Tutorial: Creación de flujos de usuario en Azure Active Directory B2C.

Sin embargo, debe considerar la posibilidad de crear directivas personalizadas en Azure Active Directory B2C , pero esto está fuera del ámbito de este tutorial.

Agregar proveedores de identidades externos

Consulte Tutorial: Incorporación de proveedores de identidades a las aplicaciones en Azure Active Directory B2C.

Registrar la aplicación (ms-identity-b2c-java-servlet-webapp-authentication)

Para registrar la aplicación, siga estos pasos:

  1. Vaya a Azure Portal y seleccione Azure AD B2C.

  2. Seleccione Registros de aplicaciones en el panel de navegación y, a continuación, seleccione Nuevo registro.

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

    • En la sección Nombre , escriba un nombre de aplicación significativo para mostrar a los usuarios de la aplicación; por ejemplo, ms-identity-b2c-java-servlet-webapp-authentication.
    • En Supported account types (Tipos de cuenta compatibles), seleccione Cuentas en cualquier directorio organizativo y cuentas Microsoft personales (por ejemplo, Skype, Xbox, Outlook.com).
    • En la sección URI de redirección (opcional), seleccione Web en el cuadro combinado y escriba el siguiente URI de redirección: http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/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 de id. de aplicación (cliente) para usarlo más adelante. Este valor se usa en el archivo o archivos de configuración de la aplicación.

  6. Seleccione Guardar para guardar los cambios.

  7. 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 donde puede generar secretos y cargar certificados.

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

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

  10. Seleccione una de las duraciones disponibles: En 1 año, En 2 años o Nunca expira.

  11. Seleccione Agregar. Se muestra el valor generado.

  12. 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 se muestra de nuevo y no se puede recuperar 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 (ms-identity-b2c-java-servlet-webapp-authentication) para usar el registro de la aplicación

Siga estos pasos para configurar la aplicación:

Nota:

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

  1. Abra el proyecto en el IDE.

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

  3. Busque la aad.clientId propiedad y reemplace el valor existente por el identificador de aplicación o clientId de la ms-identity-b2c-java-servlet-webapp-authentication aplicación desde Azure Portal.

  4. Busque la aad.secret propiedad y reemplace el valor existente por el valor que guardó durante la creación de la ms-identity-b2c-java-servlet-webapp-authentication aplicación desde Azure Portal.

  5. Busque la aad.scopes propiedad y reemplace el clientId de aplicación existente por el valor que ha colocado en aad.clientId en el paso 1 de esta sección.

  6. Busque la aad.authority propiedad y reemplace la primera instancia de fabrikamb2c por el nombre del inquilino de Azure AD B2C en el que creó la ms-identity-b2c-java-servlet-webapp-authentication aplicación en Azure Portal.

  7. Busque la aad.authority propiedad y reemplace la segunda instancia de fabrikamb2c por el nombre del inquilino de Azure AD B2C en el que creó la ms-identity-b2c-java-servlet-webapp-authentication aplicación en Azure Portal.

  8. Busque la aad.signInPolicy propiedad y reemplácela por el nombre de la directiva de flujo de usuario de registro o inicio de sesión que creó en el inquilino de Azure AD B2C en el que creó la ms-identity-b2c-java-servlet-webapp-authentication aplicación en Azure Portal.

  9. Busque la aad.passwordResetPolicy propiedad y reemplácela por el nombre de la directiva de flujo de usuario de restablecimiento de contraseña que creó en el inquilino de Azure AD B2C en el que creó la ms-identity-b2c-java-servlet-webapp-authentication aplicación en Azure Portal.

  10. Busque la aad.editProfilePolicy propiedad y reemplácela por el nombre de la directiva de flujo de usuario de perfil de edición que creó en el inquilino de Azure AD B2C en el que creó la ms-identity-b2c-java-servlet-webapp-authentication aplicación en Azure Portal.

Compilación del ejemplo

Para compilar 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ó WebLogic y configuró algún dominio de servidor.

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

  1. En el ejemplo, busque el archivo application.properties o authentication.properties donde configuró el identificador de cliente, el inquilino, la dirección URL de redirección, etc.

  2. En este archivo, cambie las referencias a localhost:8080 o localhost:8443 a la dirección URL y el puerto en los que se ejecuta WebLogic, que de forma predeterminada debe ser localhost:7001.

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

Siga estos pasos para implementar el ejemplo en WebLogic a través de la consola web:

  1. Inicie el servidor WebLogic mediante DOMAIN_NAME\bin\startWebLogic.cmd.

  2. Vaya a la consola web de WebLogic en el explorador en http://localhost:7001/console.

  3. Vaya a Implementaciones de estructura > de dominio, seleccione Instalar, cargue los archivos y busque el archivo .war que ha compilado mediante Maven.

  4. Seleccione Instalar esta implementación como una aplicación, seleccione Siguiente, Finalizar y, después, Guardar.

  5. La mayoría de los valores predeterminados deben ser correctos, excepto que debe asignar un nombre a la aplicación para que coincida con el URI de redirección establecido en la configuración de ejemplo o en el registro de aplicaciones de Azure. Es decir, si el URI de redirección es http://localhost:7001/msal4j-servlet-auth, debe asignar un nombre a la aplicación msal4j-servlet-auth.

  6. Vuelva a Implementaciones de estructura>de dominio e inicie la aplicación.

  7. Una vez iniciada la aplicación, vaya a http://localhost:7001/<application-name>/y debería poder acceder a 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 lee 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 del proveedor de identidades elegido.
  4. Observe que el botón contextual ahora indica Cerrar sesión y muestra el nombre de usuario.
  5. Seleccione Id. Token Details (Detalles del token de identificador) para ver algunas de las notificaciones descodificadas del token de identificador.
  6. También tiene la opción de editar el perfil. Seleccione el vínculo para editar detalles como el nombre para mostrar, el lugar de residencia y la profesión.
  7. Use el botón de la esquina para cerrar la sesión.
  8. Después de cerrar sesión, vaya a la siguiente dirección URL para la página de detalles del token: http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_token_details. Aquí puede observar cómo la aplicación muestra un 401: unauthorized error en lugar de las notificaciones del token de identificador.

Sobre el código

En este ejemplo se muestra cómo usar MSAL4J para iniciar sesión de los usuarios en el inquilino de Azure AD B2C.

Contenido

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

Archivo/carpeta Descripción
AuthHelper.java Funciones auxiliares para la autenticación.
Config.java Se ejecuta en el inicio y configura el lector y registrador de propiedades.
authentication.properties Microsoft Entra ID y configuración del programa.
AuthenticationFilter.java Redirige las solicitudes no autenticadas a los recursos protegidos a una página 401.
MsalAuthSession Se ha creado una instancia de con un HttpSessionobjeto . Almacena todos los atributos de sesión relacionados con MSAL en el atributo de sesión.
____Servlet.java Todos los puntos de conexión disponibles se definen en .java clases que terminan en ____Servlet.java.
CHANGELOG.md Lista de cambios en el ejemplo.
CONTRIBUTING.md Directrices para contribuir al ejemplo.
LICENCIA Licencia del ejemplo.

ConfidentialClientApplication

Se crea una ConfidentialClientApplication instancia 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 Azure AD B2C y también ayuda a intercambiar el token de autenticación para un token de acceso.

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

Los parámetros siguientes se usan para crear instancias:

  • Identificador de cliente de la aplicación.
  • Secreto de cliente, que es un requisito para aplicaciones cliente confidenciales.
  • La entidad de Azure AD B2C se concatena con el adecuado UserFlowPolicy para el registro, el inicio de sesión, la edición de perfiles o el restablecimiento de contraseña.

En este ejemplo, estos valores se leen del archivo authentication.properties mediante un lector de propiedades en el 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 es enviar una solicitud al /authorize punto de conexión del inquilino de Azure Active Directory B2C. La instancia de MSAL4J ConfidentialClientApplication se usa para construir una dirección URL de solicitud de autorización y la aplicación redirige el explorador a esta dirección URL, como se muestra en el ejemplo siguiente:

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

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

    • AuthorizationRequestUrlParameters: parámetros que se deben establecer para compilar una authorizationRequestUrl.

    • REDIRECT_URI: donde Azure AD B2C redirige el explorador (junto con el código de autenticación) después de recopilar las credenciales de usuario.

    • SCOPES: los ámbitos son permisos solicitados por la aplicación.

      Normalmente, los tres ámbitos openid profile offline_access bastarían para recibir una respuesta de token de identificador. Sin embargo, MSAL4J requiere que todas las respuestas de Azure AD B2C también contengan un token de acceso.

      Para que Azure AD B2C prescinda de un token de acceso, así como un token de identificador, la solicitud debe incluir un ámbito de recursos adicional. Dado que esta aplicación no requiere realmente un ámbito de recursos externos, agrega su propio identificador de cliente como cuarto ámbito para recibir un token de acceso.

      Puede encontrar una lista completa de los ámbitos solicitados por la aplicación en el archivo authentication.properties .

    • ResponseMode.QUERY: Azure AD B2C puede devolver la respuesta como parámetros de formulario en una solicitud HTTP POST o como parámetros de cadena de consulta en una solicitud HTTP GET.

    • Prompt.SELECT_ACCOUNT: Azure AD B2C debe pedir al usuario que seleccione la cuenta con la que pretende autenticarse.

    • state: una variable única establecida por la aplicación en la sesión en cada solicitud de token y destruida después de recibir la devolución de llamada de redirección de redirección de Azure AD B2C correspondiente. La variable de estado garantiza que las solicitudes de Azure AD B2C a /auth_redirect endpoint son realmente de solicitudes de autorización de Azure AD B2C procedentes de esta aplicación y esta sesión, lo que impide ataques CSRF. Esto se hace en el archivo AADRedirectServlet.java .

    • nonce: una variable única establecida por la aplicación en la sesión en cada solicitud de token y destruida después de recibir el token correspondiente. Este nonce se transcribe a los tokens resultantes dispensados de Azure AD B2C, lo que garantiza que no se produzca ningún ataque de reproducción de tokens.

  2. Azure Active Directory B2C presenta al usuario un mensaje de inicio de sesión. Si el intento de inicio de sesión se realiza correctamente, el explorador del usuario se redirige al punto de conexión de redireccionamiento de la aplicación. Una solicitud válida a este punto de conexión contiene un código de autorización.

  3. A continuación, la ConfidentialClientApplication instancia intercambia este código de autorización para un token de identificador y un token de acceso de Azure Active Directory B2C, como se muestra en el ejemplo siguiente:

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

    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 de un identificador o token de acceso.
    • authCode: el código de autorización que se recibió en el punto de conexión de redireccionamiento.
    • REDIRECT_URI: el URI de redirección usado en el paso anterior debe pasarse de nuevo.
    • SCOPES: los ámbitos usados en el paso anterior deben pasarse de nuevo.
  4. Si acquireToken se ejecuta correctamente, las notificaciones del token se extraen y la notificación nonce se valida con el nonce almacenado en la sesión, como se muestra en el ejemplo siguiente:

    parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache);
    validateNonce(msalAuth)
    processSuccessfulAuthentication(msalAuth);
    
  5. Si nonce se valida correctamente, el estado de autenticación se coloca en una sesión del lado servidor, aprovechando los métodos expuestos por la MsalAuthSession clase , como se muestra en el ejemplo siguiente:

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

Información adicional

Para obtener más información sobre cómo funcionan los protocolos de OAuth 2.0 en este escenario y otros escenarios, vea Escenarios de autenticación para microsoft Entra ID.

Paso siguiente

Implementación de aplicaciones De Java WebLogic en WebLogic en Azure Virtual Machines