Proteger aplicaciones de WebSphere Liberty/Open Liberty con Microsoft Entra ID mediante OpenID Connect
En este artículo se le enseña cómo proteger aplicaciones de IBM WebSphere Liberty/Open Liberty con Microsoft Entra ID mediante OpenID Connect (OIDC).
En este artículo aprenderá a:
- Configurar un proveedor de OIDC con Microsoft Entra ID.
- Proteger una aplicación de WebSphere Liberty/Open Liberty mediante OIDC.
- Ejecutar y probar la aplicación de WebSphere Liberty/Open Liberty.
Requisitos previos
- Suscripción a Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
- Una identidad Azure con al menos el rol de Microsoft Entra de administrador de aplicaciones en la nube. Para obtener más información, consulte Enumeración de asignaciones de roles de Microsoft Entra y Roles integrados de Microsoft Entra.
- Un inquilino de Microsoft Entra. Si no tiene un inquilino, consulte Inicio rápido: Configurar Configuración de un inquilino.
- Una máquina local con un sistema operativo tipo Unix instalado, por ejemplo, Ubuntu, macOS o Windows Subsystem para Linux.
- Git.
- Una implementación de Java SE, versión 21 o posterior, por ejemplo, la compilación de Microsoft de OpenJDK.
- Maven, versión 3.9.3 o superior.
Configurar un proveedor de OIDC con Microsoft Entra ID
OpenID Connect es un protocolo de autenticación estándar del sector que funciona muy bien con Microsoft Entra ID. En esta sección, configurará un proveedor de OIDC con Microsoft Entra ID para usarlo con su aplicación de WebSphere Liberty/Open Liberty. Más adelante, configurará la aplicación de WebSphere Liberty/Open Liberty usando OIDC para autenticar y autorizar a los usuarios en su inquilino de Microsoft Entra.
Creación de usuarios en el inquilino de Microsoft Entra
En primer lugar, cree dos usuarios en su inquilino de Microsoft Entra siguiendo los pasos que se indican en Creación, invitación y eliminación de usuarios. Solo tiene que consultar la sección Creación de un nuevo usuario. Siga las instrucciones a medida que avanza por el artículo y vuelva a este artículo después de crear los usuarios en su inquilino de Microsoft Entra.
Para crear un usuario que actúe como "administrador" en la aplicación, siga estos pasos:
- Cuando llegue a la pestaña Aspectos básicos en la sección Creación de un nuevo usuario, siga los pasos a continuación:
En Nombre principal de usuario, escriba admin. Guarde el valor para poder usarlo más tarde cuando inicie sesión en la aplicación.
En Alias de correo, seleccione Derivar del nombre principal de usuario
En Nombre para mostrar, escriba admin.
En Contraseña, seleccione Generar contraseña automáticamente. Copie y guarde el valor de Contraseña para usarlo más adelante cuando inicie sesión en la aplicación.
Seleccione Cuenta habilitada.
Seleccione Revisar y crear>Crear. Espere a que se cree el usuario.
Espere un minuto más o menos y seleccione Actualizar. Debería ver al nuevo usuario en la lista.
Para crear un usuario que actúe como "usuario" en la aplicación, repita los mismos pasos, pero use los siguientes valores:
- En Nombre principal de usuario, escriba Usuario.
- En Nombre para mostrar, escriba Usuario.
Registro de una aplicación en Microsoft Entra ID
A continuación, registre una aplicación siguiendo los pasos que se indican en Inicio rápido: Registro de una aplicación con la plataforma de identidad de Microsoft. Siga las instrucciones a medida que avanza por el artículo y vuelva a este artículo después de registrar y configurar la aplicación.
- Cuando llegue a la sección Registrar una aplicación, siga los pasos a continuación:
- En Tipos de cuenta admitidos, seleccione Cuentas de este directorio organizativo solo (Solo directorio predeterminado: inquilino único).
- Cuando finalice el registro, guarde los valores de ID de aplicación (cliente) y ID de directorio (inquilino) para usarlos más adelante en la configuración de la aplicación.
- Cuando llegue a la sección Agregar un URI de redireccionamiento, sáltese los pasos de momento. Agregará el URI de redireccionamiento más adelante en este artículo al ejecutar y probar la aplicación de ejemplo de forma local.
- Cuando llegue a la sección Agregar credenciales, seleccione la pestaña Agregar un secreto de cliente.
- Cuando agregue un secreto de cliente, anote el valor Secreto de cliente para usarlo más adelante en la configuración de la aplicación.
Incorporación de roles de aplicación a una aplicación
A continuación, agregue roles de aplicación a su aplicación siguiendo los pasos que se indican en Incorporación de roles de aplicación a una aplicación y su recepción en el token. Solo necesita consultar las secciones Declaración de roles para una aplicación y Asignación de usuarios y grupos a roles de Microsoft Entra. Siga las instrucciones a medida que avanza por el artículo y vuelva a este artículo después de declarar los roles para la aplicación.
Cuando llegue a la sección Declaración de roles para una aplicación, use la interfaz de usuario oles de aplicación para crear roles para el administrador y el usuario normal.
Cree un rol de usuario administrador con los siguientes valores:
- En Nombre para mostrar, escriba admin.
- En Tipos de miembro permitidos, seleccione Usuarios/Grupos.
- En Valor, escriba admin.
- En Descripción, escriba admin.
- Seleccione ¿quiere habilitar este rol de aplicación?.
Seleccione Aplicar. Espere a que se cree el role.
Cree un rol de usuario normal siguiendo los mismos pasos, pero con los siguientes valores:
- En Nombre para mostrar, escriba Usuario.
- En Valor, escriba usuario.
- En Descripción, escriba usuario.
Cuando llegue a la sección Asignación de usuarios y grupos a roles de Microsoft Entra, siga los pasos a continuación:
Selecciona Agregar usuario o grupo.
En el panel Agregar asignación, en Usuarios, seleccione el usuario Admin y en Seleccionar un rol, seleccione el rol Admin. A continuación, seleccione Asignar. Espere hasta que la asignación de la aplicación se complete. Es posible que tenga que desplazarse lateralmente por la tabla para ver la columna Rol asignado.
Repita los pasos anteriores para asignar el rol Usuario al usuario Usuario.
Seleccione Actualizar para ver los usuarios y roles asignados en el panel Usuarios y grupos.
Puede que tenga que ajustar la anchura de los encabezados de columna para que pueda visualizar lo mismo que en la imagen.
No siga ningún otro paso de Incorporación de roles de aplicación a una aplicación y su recepción en el token.
Proteger una aplicación de WebSphere Liberty/Open Liberty mediante OpenID Connect
En esta sección, aprenderá a proteger una aplicación de WebSphere Liberty/Open Liberty que autentica y autoriza a los usuarios en su inquilino de Microsoft Entra mediante el uso de OIDC. También descubrirá cómo dar acceso a los usuarios a determinadas partes de la aplicación mediante el control de acceso basado en roles (RBAC). La aplicación usa la configuración de la directiva de seguridad mediante programación de la especificación Jakarta Servlet. Jakarta EE también admite servicios web RESTful. Consulte la sección Paso siguientes para acceder al artículo sobre cómo proteger una aplicación de servicios web RESTful.
La aplicación de WebSphere Liberty/Open Liberty de ejemplo para esta guía de inicio rápido se encuentra en GitHub en el repositorio liberty-entra-id.
Habilitación de la autenticación y la autorización para proteger la aplicación
La aplicación tiene un recurso de página de bienvenida definido en index.html, que se muestra en el siguiente código de ejemplo. Los usuarios no autenticados pueden acceder a esta página. La ruta raíz de la página de bienvenida se encuentra en /
.
<!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>
Desde la página de bienvenida, los usuarios pueden iniciar sesión en la aplicación para acceder a la página de perfil. La página de bienvenida tiene enlaces para iniciar sesión como usuario o como administrador. Los enlaces se encuentran en /profile/user
y /profile/admin
, respectivamente.
Los enlaces /profile/user
y /profile/admin
llevan al servlet del perfil, que se define en ProfileServlet.java, tal como se muestra en el siguiente código de ejemplo. A este servlet solo pueden acceder los usuarios autenticados con la anotación jakarta.servlet.annotation.ServletSecurity
y la anotación jakarta.servlet.annotation.HttpConstraint
. El atributo rolesAllowed = {"users"}
indica que solo los usuarios autenticados con el rol de seguridad users
pueden acceder a la ruta /profile
. Al usuario autenticado se le asigna automáticamente el rol users
en el archivo de configuración de 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);
}
}
El servlet de perfil recupera los roles del usuario a partir del token del ID y comprueba si el usuario tiene asignado el rol admin
cuando el usuario intenta acceder a la ruta /profile/admin
. Si el usuario no tiene asignado el rol admin
, el servlet devolverá el error 403 Prohibido. En otros casos, el servlet recuperará el nombre del usuario y reenviará la solicitud a la página del perfil con el nombre y los roles del usuario.
La interfaz de usuario de la página de perfil viene definida en profile.jsp, tal como se muestra en el siguiente ejemplo. En esta página aparece el nombre y los roles del usuario. La página del perfil también incluye un vínculo de cierre de sesión en /logout
. La página del perfil se escribe en JSP (Jakarta Server Pages). Tenga en cuenta el uso de las expresiones ${}
en la página. ${}
indica el uso del lenguaje de expresiones de Jakarta (EL). Las expresiones EL se reemplazan por los valores de las variables correspondientes cuando se visualiza la página. Consulte la sección Pasos siguientes para obtener información sobre la especificación 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>
Cuando el usuario selecciona el vínculo para cerrar la sesión, la aplicación llama al servlet de cierre de sesión, definido en LogoutServlet.java, tal como se muestra en el código de ejemplo siguiente. El servlet de cierre de sesión llama al método request.logout()
para cerrar la sesión del usuario y luego lo redirige a la página principal.
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("/");
}
}
Ejecutar y probar la aplicación de WebSphere Liberty/Open Liberty
En esta sección, aprenderá a ejecutar y probar la aplicación de WebSphere Liberty/Open Liberty para ver cómo funciona con Microsoft Entra ID como proveedor de OIDC.
Agregar un URI de redireccionamiento al registro de la aplicación
Para ejecutar y probar correctamente la aplicación de forma local, debe agregar un URI de redireccionamiento al registro de la aplicación. Siga las instrucciones que se indican en la sección Agregar un URI de redireccionamiento de Inicio rápido: Registrar una aplicación con el Plataforma de identidad de Microsoft y use los siguientes valores:
- En Configurar plataformas, seleccione Web.
- Para los URI de redirección, introduzca
https://localhost:9443/ibm/api/social-login/redirect/liberty-entra-id
.
Preparar el ejemplo
Siga este procedimiento para preparar la aplicación de ejemplo:
Use los siguientes comandos para clonar la aplicación de ejemplo en GitHub:
git clone https://github.com/Azure-Samples/liberty-entra-id cd liberty-entra-id git checkout 2024-09-26
Si ve un mensaje acerca de estar en el estado
detached HEAD
, puede ignorarlo con seguridad. Este mensaje solo significa que ha extraído una etiqueta.Use los siguientes comandos para definir las siguientes variables de entorno con los valores que anotó anteriormente:
export CLIENT_ID==<application/client-ID> export CLIENT_SECRET=<client-secret> export TENANT_ID=<directory/tenant-ID>
Estas variables de entorno aportan los valores de la compatibilidad integrada de OIDC en WebSphere Liberty/Open Liberty. La configuración de OIDC correspondiente en el server.xml de Liberty aparece en el ejemplo siguiente.
<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" />
Si el valor de una variable no viene definido en el archivo de configuración, WebSphere Liberty/Open Liberty leerá el valor de las variables de entorno siguiendo sus reglas de nomenclatura. Para obtener más información sobre la conversión de nomenclatura, consulte Prioridad de sustitución de variables.
Ejecutar la aplicación de WebSphere Liberty/Open Liberty
Puede ejecutar la aplicación mediante liberty-maven-plugin
. Para ejecutar la aplicación, elija uno de los siguientes métodos:
Nota:
Para permitir que WebSphere Liberty/Open Liberty se conecte a Microsoft Entra ID, asegúrese de ejecutar el comando en el shell en el que definieran las variables de entorno que se mostraron en la sección anterior.
Ejecutar la aplicación en modo de desarrollo:
mvn liberty:dev
Ejecutar la aplicación en modo de tiempo de ejecución:
mvn liberty:run
Si desea probar diferentes modos, use Ctrl+C para detener la aplicación y luego ejecútela en otro modo.
Probar la aplicación de WebSphere Liberty/Open Liberty
Una vez ejecutada la aplicación, abra un navegador web con una pestaña privada y vaya a https://localhost:9443
. Dado que el certificado está autofirmado, quizá le aparezca una advertencia sobre el certificado. Puede saltarse la advertencia de forma segura y acceder al sitio.
Esto le llevará a la página de bienvenida con los enlaces para iniciar sesión como usuario o como administrador. El uso de una pestaña privada evita contaminar cualquier actividad existente de Microsoft Entra ID que pueda tener en su navegador habitual.
Recopilación de las credenciales de los dos usuarios
En este artículo, Microsoft Entra ID usa la dirección de correo electrónico de cada usuario como ID de usuario para iniciar sesión. Siga los pasos a continuación para obtener la dirección de correo electrónico del usuario administrador y del usuario normal:
- Inicie sesión en el Centro de administración de Microsoft Entra como Administrador de aplicaciones en la nube.
- Si tiene acceso a varios inquilinos, use el icono Configuración () del menú superior para cambiar al inquilino en el que desea registrar la aplicación desde el menú Directorios + suscripciones.
- Vaya a Identidad > Usuarios > Todos los usuarios.
- Localice el usuario admin en la lista y selecciónelo.
- Localice el campo Nombre principal de usuario.
- Use el icono de copia situado junto al valor del campo para guardar la dirección de correo electrónico del usuario en el portapapeles. Guarde el valor para usarlo más adelante.
- Para obtener la dirección de correo electrónico del usuario normal, siga los mismos pasos.
Use las contraseñas para el usuario administrador y el usuario normal que estableció al crear los usuarios.
Uso de la funcionalidad de la aplicación
Siga los pasos a continuación para usar esta instancia:
Seleccione el enlace Iniciar sesión como usuario. Inicie sesión con el usuario normal que creó anteriormente. Después de iniciar sesión, Microsoft Entra ID le redirige a la página de perfil, donde verá su nombre y roles.
Si es la primera vez que inicia sesión, se le pedirá que cambie la contraseña. Siga las instrucciones para actualizar la contraseña.
Si se le indica Su organización requiere información de seguridad adicional. Siga las instrucciones para descargar y configurar la aplicación Microsoft Authenticator, puede seleccionar Preguntar más tarde para continuar con la prueba.
Si se le indica Permisos solicitados, revise los permisos solicitados por la aplicación. Seleccione Aceptar para continuar con la prueba.
Seleccione Cerrar sesión para cerrar sesión en la aplicación. Después de cerrar la sesión, se le redirigirá a la página principal.
Seleccione el enlace Iniciar sesión como administrador. Microsoft Entra ID le redirige a la página de inicio de sesión. Inicie sesión con el usuario administrador que creó anteriormente. Después de iniciar sesión, Microsoft Entra ID le redirige a la página de perfil similar, con un rol diferente
admin
.Vuelva a cerrar la sesión e inténtelo en Iniciar sesión como admin con el usuario normal que creó anteriormente. Debería ver un mensaje de error porque el usuario normal no tiene el rol
admin
.
Limpieza de recursos
En este artículo no se le indica cómo implementar su aplicación en Azure. No hay recursos de Azure para limpiar la aplicación, aunque hay disponibles recursos de Microsoft Entra ID. Para implementar una aplicación en Azure, puede consultar la guía a la que se hace referencia en la siguiente sección.
Cuando termine con los recursos para esta aplicación de ejemplo, siga los pasos a continuación para limpiar los recursos de Microsoft Entra ID. La eliminación de los recursos de Microsoft Entra ID no usados es una importante práctica recomendada de seguridad.
- Elimine el registro de la aplicación que ha creado siguiendo los pasos que se indican en Eliminación de una aplicación registrada con la plataforma de identidad de Microsoft. Solo tiene que seguir los pasos de la sección Eliminación de una aplicación creada por su organización.
- El acto de eliminar el registro de la aplicación también debería eliminar la aplicación empresarial. Para obtener más información sobre la eliminación de aplicaciones empresariales, consulte Eliminación de una aplicación empresarial.
- Elimine los usuarios que ha creado siguiendo los pasos que se indican en Creación, invitación y eliminación de usuarios.
Pasos siguientes
En esta guía de inicio rápido, sabrá cómo proteger las aplicaciones de WebSphere Liberty/Open Liberty con Microsoft Entra ID mediante OIDC. Para obtener más información, consulte los siguientes recursos:
- Implementación de una aplicación Java con Open Liberty o WebSphere Liberty en Azure Container Apps
- Implementación de WebSphere Liberty y Open Liberty en Red Hat OpenShift en Azure
- Implementación de una aplicación Java con Open Liberty o WebSphere Liberty en un clúster de Azure Kubernetes Service (AKS)
- Autenticación OpenID Connect con Microsoft Entra ID
- Plataforma de identidad y flujo de código de autorización de OAuth 2.0
- Autenticación de usuarios a través de proveedores de redes sociales
- Inicio de sesión 1.0 en redes sociales
- Cliente de OpenID Connect 1.0
- ¿Qué es OpenID Connect?
- Configuración de directivas de seguridad mediante programación
- Cómo proteger un servicio web RESTful mediante Jakarta EE
- Lenguaje de expresiones de Jakarta