Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra una aplicación de Java JBoss EAP que autentica a los usuarios en Azure Active Directory B2C (Azure AD B2C) mediante la Biblioteca de autenticación de Microsoft para Java (MSAL4J).
Nota:
A partir del 1 de mayo de 2025, Azure Active Directory B2C ya no está disponible para su compra por parte de nuevos clientes. Los clientes existentes pueden seguir usando Azure AD B2C, con soporte proporcionado hasta al menos mayo de 2030. Para los nuevos proyectos de administración de identidades y acceso de clientes (CIAM), use Id. externa de Microsoft Entra en su lugar.
En el siguiente diagrama se 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 identificación prueba que el usuario está autenticado en un inquilino de Azure AD B2C.
Requisitos previos
- JDK versión 8 o posterior
- Maven 3
- Un inquilino de Azure AD B2C. Para obtener más información, consulte Tutorial: Crear un inquilino de Azure Active Directory B2C.
- Una cuenta de usuario en tu directorio de Azure AD B2C.
Recomendaciones
- Cierta familiaridad con los servlets de Java/Jakarta.
- Cierta familiaridad con el terminal Linux/OSX.
- 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 para mantenerse up-to-date con los últimos desarrollos.
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-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 las limitaciones de longitud de las rutas de archivo en Windows, clone o extraiga el repositorio en un directorio cercano a la raíz del disco duro.
Registra la aplicación de ejemplo en tu 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.
Selección del inquilino de Azure AD B2C en el que quiere crear las aplicaciones
Para elegir el inquilino, siga estos pasos:
Inicie sesión en Azure Portal.
Si su cuenta existe en más de un inquilino de Azure AD B2C, seleccione su perfil en la esquina de Azure Portal y 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 registro, inicio de sesión, edición de perfiles y 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: Adición de proveedores de identidades a las aplicaciones en Azure Active Directory B2C
Registro de la aplicación (ms-identity-b2c-java-servlet-webapp-authentication)
Para registrar la aplicación, siga estos pasos:
Vaya a Azure Portal y seleccione Azure AD B2C.
Seleccione Registros de aplicaciones en el panel de navegación y, a continuación, seleccione Nuevo registro.
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,
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 los siguientes URI de redirección:
http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_redirect.
- 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,
Seleccione Registrar para crear la aplicación.
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.
Seleccione Guardar para guardar los cambios.
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.
En la sección Secretos de cliente, seleccione Nuevo secreto de cliente.
Escriba una descripción, por ejemplo, secreto de aplicación.
Seleccione una expiración para el secreto o especifique una duración personalizada. Los secretos de cliente se limitan a una duración máxima de 24 meses y Microsoft recomienda una expiración de menos de 12 meses. Para las aplicaciones de producción, se recomienda usar un certificado o una credencial de identidad federada en lugar de un secreto de cliente.
Seleccione Agregar. Se muestra el valor generado.
Copie y guarde el valor generado para usarlo en pasos posteriores. Necesitas este valor para los archivos de configuración de tu 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.
Configure la aplicación (ms-identity-b2c-java-servlet-webapp-authentication) 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.
Abra el proyecto en su IDE.
Abra el archivo ./src/main/resources/authentication.properties.
Busque la propiedad
aad.clientIdy reemplace el valor existente por el identificador de aplicación oclientIdde la aplicaciónms-identity-b2c-java-servlet-webapp-authenticationde Azure Portal.Busque la propiedad
aad.secrety reemplace el valor existente por el valor que guardó durante la creación de la aplicaciónms-identity-b2c-java-servlet-webapp-authenticationdesde Azure Portal.Busque la propiedad
aad.scopesy reemplace el clientId de aplicación existente por el valor que colocó enaad.clientIden el paso 1 de esta sección.Busque la propiedad
aad.authorityy reemplace la primera instancia defabrikamb2cpor el nombre del tenant de Azure AD B2C en el que creó la aplicaciónms-identity-b2c-java-servlet-webapp-authenticationen el portal de Azure.Busque la propiedad
aad.authorityy reemplace la segunda instancia defabrikamb2cpor el nombre del directorio de Azure AD B2C en el que creó la aplicaciónms-identity-b2c-java-servlet-webapp-authenticationen el portal de Azure.Busque la propiedad
aad.signInPolicyy 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 aplicaciónms-identity-b2c-java-servlet-webapp-authenticationen Azure Portal.Busque la propiedad
aad.passwordResetPolicyy 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 aplicaciónms-identity-b2c-java-servlet-webapp-authenticationen Azure Portal.Busque la propiedad
aad.editProfilePolicyy reemplácela por el nombre de la directiva de flujo de usuario de edición del perfil que creó en el tenant de Azure AD B2C en el que creó la aplicaciónms-identity-b2c-java-servlet-webapp-authenticationen el portal de Azure.
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 las secciones siguientes se indica cómo implementar el ejemplo en Azure App Service.
Requisitos previos
Complemento Maven para Azure App Service Apps
Si Maven no es la herramienta de desarrollo que más usa, consulte los siguientes tutoriales similares donde se usan otras herramientas:
Configuración del complemento Maven
El proceso de implementación en Azure App Service usa sus credenciales de Azure desde la CLI de Azure automáticamente. El complemento Maven se autentica con OAuth o el inicio de sesión del dispositivo si la CLI de Azure no está instalada localmente. Para más información, consulte Autenticación con los complementos de Maven.
Use los pasos siguientes para configurar el complemento:
Ejecute el siguiente comando de Maven para configurar la implementación. Este comando le ayuda a configurar el sistema operativo de App Service, la versión de Java y la versión de Tomcat.
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:configEn Crear nueva configuración de ejecución, pulse Y y, a continuación, pulse Intro.
En Definir valor para el sistema operativo, pulse 2 para Linux y, a continuación, pulse Intro.
En Definir valor para javaVersion, pulse 2 para Java 11 y, a continuación, pulse Intro.
En Definir valor para webContainer, pulse 1 para JBosseap7 y, a continuación, pulse Entrar.
Para Definir valor para pricingTier, pulse Intro para seleccionar el nivel predeterminado P1v3.
En Confirmar, pulse Y y, a continuación, pulse Entrar.
En el ejemplo siguiente se ve el resultado del proceso de implementación:
Please confirm webapp properties
AppName : msal4j-servlet-auth-1707220080695
ResourceGroup : msal4j-servlet-auth-1707220080695-rg
Region : centralus
PricingTier : P1v3
OS : Linux
Java Version: Java 11
Web server stack: JBosseap 7
Deploy to slot : false
Confirm (Y/N) [Y]:
[INFO] Saving configuration to pom.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 26.196 s
[INFO] Finished at: 2024-02-06T11:48:16Z
[INFO] ------------------------------------------------------------------------
Una vez que haya confirmado las opciones, el complemento agregará la configuración del complemento y los ajustes necesarios del archivo pom.xml del proyecto para configurar la aplicación web para que se ejecute en Azure App Service.
La parte correspondiente del archivo pom.xml debe ser similar al ejemplo siguiente:
<build>
<plugins>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>>azure-webapp-maven-plugin</artifactId>
<version>x.xx.x</version>
<configuration>
<schemaVersion>v2</schemaVersion>
<resourceGroup>your-resourcegroup-name</resourceGroup>
<appName>your-app-name</appName>
...
</configuration>
</plugin>
</plugins>
</build>
Las configuraciones de App Service se pueden modificar directamente en el archivo pom.xml. Algunas configuraciones comunes se enumeran en la tabla siguiente:
| Propiedad | Obligatorio | Descripción | Versión |
|---|---|---|---|
schemaVersion |
false | Versión del esquema de configuración. Los valores admitidos son v1 y v2. |
1.5.2 |
subscriptionId |
false | Identificador de la suscripción. | 0.1.0+ |
resourceGroup |
true | El grupo de recursos de Azure para la aplicación. | 0.1.0+ |
appName |
true | Nombre de la aplicación. | 0.1.0+ |
region |
false | Región en la que se va a hospedar la aplicación. El valor predeterminado es centralus. Para conocer las regiones válidas, consulte Regiones admitidas. |
0.1.0+ |
pricingTier |
false | El nivel de precios de tu aplicación. El valor predeterminado es P1v2 para una carga de trabajo de producción. El valor mínimo recomendado para desarrollo y pruebas de Java es B2. Para más información, consulte Precios de App Service |
0.1.0+ |
runtime |
false | Configuración del entorno en runtime. Para obtener más información, consulte Detalles de configuración. | 0.1.0+ |
deployment |
false | Configuración de implementación. Para obtener más información, consulte Detalles de configuración. | 0.1.0+ |
Para obtener la lista completa de configuraciones, consulte la documentación de referencia del complemento. Todos los complementos de Azure Maven comparten un conjunto común de configuraciones. Para ver estas configuraciones, consulte Configuraciones comunes. Para conocer las configuraciones específicas de Azure App Service, consulte Aplicación de Azure: Detalles de configuración.
Asegúrese guardar los valores appName y resourceGroup para usarlos más adelante.
Preparar la aplicación para la implementación
Al implementar la aplicación en App Service, la dirección URL de redireccionamiento cambia a la dirección URL de redireccionamiento de la instancia de aplicación implementada. Siga estos pasos para cambiar esta configuración en el archivo de propiedades:
Acceda al archivo authentication.properties de la aplicación y cambie el valor de
app.homePagepor el nombre de dominio de la aplicación implementada, tal como se muestra en el ejemplo siguiente. Por ejemplo, si eligióexample-domainpara el nombre de la aplicación en el paso anterior, ahora debe usarhttps://example-domain.azurewebsites.netpara el valorapp.homePage. Asegúrese de que también ha cambiado el protocolo dehttpahttps.# 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://<your-app-name>.azurewebsites.netDespués de guardar este archivo, use el siguiente comando para volver a compilar la aplicación:
mvn clean package
Importante
En este mismo archivo authentication.properties encontrará un ajuste para su aad.secret. No es recomendable implementar este valor en App Service. Tampoco es un procedimiento recomendado dejar este valor en el código y potencialmente insertarlo en el repositorio de Git. Para quitar este valor secreto de su código, puede encontrar instrucciones más detalladas en la sección Implementar en App Service: Eliminar el secreto. Esta guía añade pasos adicionales para cargar el valor del secreto en Key Vault y usar Key Vault References.
Actualizar el registro de la aplicación de Microsoft Entra ID
Como el URI de redireccionamiento pasa a ser el de su aplicación implementada en Azure App Service, también debe cambiar el URI de redireccionamiento en el registro de aplicaciones de Microsoft Entra ID. Para realizar este cambio, siga estos pasos:
Vaya a la página de Registros de aplicaciones de la plataforma de identidad de Microsoft para desarrolladores.
Use el recuadro de búsqueda para buscar el registro de la aplicación; por ejemplo,
java-servlet-webapp-authentication.Para abrir el registro de la aplicación, seleccione el nombre.
Seleccione Autenticar desde el menú.
En la sección Web - URIs de redireccionamiento, seleccione Agregar URI.
Rellene el URI de la aplicación, anexando
/auth/redirect; por ejemplo,https://<your-app-name>.azurewebsites.net/auth/redirect.Seleccione Guardar.
Implementar la aplicación
Ya estamos listos para implementar la aplicación en Azure App Service. Use el comando siguiente para asegurarse de que ha iniciado sesión en el entorno de Azure para ejecutar la implementación:
az login
Con toda la configuración lista en el archivo pom.xml, ahora puede usar el comando siguiente para implementar la aplicación de Java en Azure:
mvn package azure-webapp:deploy
Una vez finalizada la implementación, la aplicación está lista en http://<your-app-name>.azurewebsites.net/. Abra la dirección URL con el explorador web local, donde debería ver la página de inicio de la aplicación msal4j-servlet-auth.
Explora el ejemplo
Siga estos pasos para explorar el ejemplo:
- Observe que el estado de inicio de sesión o de cierre de sesión se muestra en el centro de la pantalla.
- Seleccione el botón contextual en la esquina. Este botón indica Iniciar sesión cuando se ejecuta por primera vez la aplicación.
- En la página siguiente, siga las instrucciones e inicie sesión con una cuenta del proveedor de identidades elegido.
- Observe que el botón contextual ahora indica Cerrar sesión y muestra el nombre de usuario.
- Seleccione Detalles del token de ID para ver algunas de las declaraciones decodificadas del token de ID.
- 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.
- Usa el botón de la esquina para cerrar sesión.
- 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 un401: unauthorizederror en lugar de las declaraciones del token de ID.
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 instancia con un HttpSession. 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 clases de Java con nombres que terminan en Servlet.. |
| CHANGELOG.md | Lista de cambios en la muestra. |
| CONTRIBUTING.md | Directrices para contribuir al ejemplo. |
| LICENCIA | La licencia de la muestra. |
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 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();
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.
- La autoridad de Azure AD B2C concatenada con el
UserFlowPolicyadecuado para el registro, el inicio de sesión, la edición del perfil o el restablecimiento de la contraseña.
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:
El primer paso del proceso de inicio de sesión consiste en enviar una solicitud al punto de conexión
/authorizedel inquilino de Azure Active Directory B2C. La instanciaConfidentialClientApplicationde MSAL4J 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 crear 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: Alcances son permisos solicitados por la aplicación.Normalmente, los tres alcances
openid profile offline_accessserían suficientes para recibir una respuesta con un 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 á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 llamada de retorno de redirección de Azure AD B2C correspondiente. La variable de estado garantiza que las solicitudes de Azure AD B2C a/auth_redirect endpointson 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 incorpora a los tokens resultantes emitidos por Azure AD B2C, lo que garantiza que no se produzca ningún ataque de repetición de tokens.
Azure Active Directory B2C presenta al usuario un mensaje de inicio de sesión. Si el intento de inicio de sesión tiene éxito, el navegador del usuario se redirige al endpoint de redirección de la aplicación. Una solicitud válida a este punto de conexión contendrá un código de autorización.
A continuación, la instancia
ConfidentialClientApplicationintercambia 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 por un identificador o token de acceso. -
authCode: El código de autorización que se recibió en el extremo 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.
-
Si
acquireTokense realiza correctamente, se extraen las declaraciones del token y la declaración nonce se valida comparándola con el nonce almacenado en la sesión, como se muestra en el ejemplo siguiente:parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache); validateNonce(msalAuth) processSuccessfulAuthentication(msalAuth);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 clase
MsalAuthSession, como se muestra en el ejemplo siguiente:msalAuth.setAuthenticated(true); msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
Más información
- ¿Qué es Azure Active Directory B2C?
- Tipos de aplicaciones que se pueden usar en Active Directory B2C
- Recomendaciones y procedimientos recomendados para Azure Active Directory B2C
- Sesión de Azure AD B2C
- Biblioteca de autenticación de Microsoft (MSAL) para Java
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.