Compartir a través de


Protección de aplicaciones de Java Spring Boot con Azure Active Directory B2C

En este artículo se muestra una aplicación web de Java Spring Boot que inicia sesión de los usuarios en el inquilino de Azure Active Directory B2C mediante la biblioteca cliente de Spring Boot Starter de Azure AD B2C para Java. Usa el protocolo OpenID Connect.

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 cliente usa la biblioteca cliente de Spring Boot Starter de Azure AD B2C para Java para iniciar sesión en un usuario y obtener un token de identificador de Azure AD B2C. El token de identificador demuestra que el usuario se autentica con Azure AD B2C y permite al usuario acceder a rutas protegidas.

Requisitos previos

Recomendaciones

  • Cierta familiaridad con Spring Framework
  • 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 4-spring-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.

Este ejemplo incluye una aplicación registrada previamente con fines de demostración. Si quiere usar su propio inquilino y aplicación de Azure AD B2C, registre y configure la aplicación en Azure Portal. Para obtener más información, consulte la sección Registrar la aplicación . De lo contrario, continúe con los pasos de la sección 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.

También debe considerar la posibilidad de crear directivas personalizadas en Azure Active Directory B2C. Sin embargo, esta tarea está fuera del ámbito de este tutorial. Para más información, consulte Introducción a la directiva personalizada de Azure AD B2C.

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 (java-spring-webapp-auth-b2c)

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, java-spring-webapp-auth-b2c.
    • En Tipos de cuenta admitidos, seleccione Cuentas en cualquier proveedor de identidad o directorio organizacional (para autenticar usuarios con flujos de usuarios).
    • 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/login/oauth2/code/.
  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 el panel Certificados y secretos en el panel de navegación para abrir la página para 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 según sus preocupaciones de seguridad, por ejemplo, En 2 años.

  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 (java-spring-webapp-auth-b2c) 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/application.yml .

  3. Busque la client-id propiedad y reemplace el valor existente por el identificador de aplicación o clientId de la java-spring-webapp-auth-b2c aplicación desde Azure Portal.

  4. Busque la client-secret propiedad y reemplace el valor existente por el valor que guardó durante la creación de la java-spring-webapp-auth-b2c aplicación desde Azure Portal.

  5. Busque la base-uri propiedad y reemplace las dos instancias del valor fabrikamb2c por el nombre del inquilino de Azure AD B2C en el que creó la java-spring-webapp-auth-b2c aplicación en Azure Portal.

  6. Busque la sign-up-or-sign-in 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 java-spring-webapp-auth-b2c aplicación en Azure Portal.

  7. Busque la profile-edit 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 java-spring-webapp-auth-b2c aplicación en Azure Portal.

  8. Busque la password-reset 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 java-spring-webapp-auth-b2c aplicación en Azure Portal.

  9. Abra el archivo src/main/resources/templates/navbar.html .

  10. Busque las referencias a los b2c_1_susi flujos y y b2c_1_edit_profile reemplácelas por los sign-up-sign-in flujos de usuario y profile-edit .

Ejecución del ejemplo

En las secciones siguientes se muestra cómo implementar el ejemplo en Azure Spring Apps.

Requisitos previos

Preparación del proyecto spring

Siga estos pasos para preparar el proyecto:

  1. Use el siguiente comando de Maven para compilar el proyecto:

    mvn clean package
    
  2. Ejecute el proyecto de ejemplo localmente mediante el comando siguiente:

    mvn spring-boot:run
    

Configuración del complemento Maven

Ejecute el siguiente comando en la raíz del proyecto para configurar la aplicación mediante el complemento Maven para Azure Spring Apps:

mvn com.microsoft.azure:azure-spring-apps-maven-plugin:1.19.0:config

En la lista siguiente se describen las interacciones del comando:

  • Inicio de sesión de OAuth2: debe autorizar el inicio de sesión a Azure en función del protocolo OAuth2.
  • Seleccionar suscripción: seleccione el número de lista de suscripciones donde desea crear la instancia de Azure Spring Apps, que tiene como valor predeterminado la primera suscripción de la lista. Si desea usar el número predeterminado, presione Entrar.
  • Escriba el nombre de Azure Spring Apps: escriba el nombre de la instancia de Spring Apps que desea crear. Si desea usar el nombre predeterminado, presione Entrar.
  • Escriba el nombre del grupo de recursos: escriba el nombre del grupo de recursos en el que desea crear la instancia de Spring Apps. Si desea usar el nombre predeterminado, presione Entrar.
  • Sku: seleccione la SKU que desea usar para la instancia de Spring Apps. Si desea usar el número predeterminado, presione Entrar.
  • Escriba el nombre de la aplicación (demostración): Proporcione un nombre de aplicación. Si desea usar el identificador de artefacto del proyecto predeterminado, presione Entrar.
  • Entornos de ejecución: seleccione el entorno de ejecución que desea usar para la instancia de Spring Apps. En este caso, debe usar el número predeterminado, por lo que presione Entrar.
  • ¿Exponer el acceso público para esta aplicación (boot-for-azure)?: Presione y.
  • Confirmar para guardar todas las configuraciones anteriores: presione y. Si presiona n, la configuración no se guarda en el archivo .pom .

En el ejemplo siguiente se muestra la salida del proceso de implementación:

Summary of properties:
Subscription id   : 12345678-1234-1234-1234-123456789101
Resource group name : rg-ms-identity-spring-boot-webapp
Azure Spring Apps name : cluster-ms-identity-spring-boot-webapp
Runtime Java version : Java 11
Region            : eastus
Sku               : Standard
App name          : ms-identity-spring-boot-webapp
Public access     : true
Instance count/max replicas : 1
CPU count         : 1
Memory size(GB)   : 2
Confirm to save all the above configurations (Y/n):
[INFO] Configurations are saved to: /home/user/ms-identity-msal-java-samples/4-spring-web-app/1-Authentication/sign-in/pom.    xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:57 min
[INFO] Finished at: 2024-02-14T13:50:44Z
[INFO] ------------------------------------------------------------------------

Después de confirmar las opciones, el complemento agrega el elemento de complemento y la configuración necesarios al archivo pom.xml del proyecto para configurar la aplicación para que se ejecute en Azure Spring Apps.

La parte pertinente del archivo pom.xml debe ser similar al ejemplo siguiente:

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-spring-apps-maven-plugin</artifactId>
    <version>1.19.0</version>
    <configuration>
        <subscriptionId>12345678-1234-1234-1234-123456789101</subscriptionId>
        <resourceGroup>rg-ms-identity-spring-boot-webapp</resourceGroup>
        <clusterName>cluster-ms-identity-spring-boot-webapp</clusterName>
        <region>eastus</region>
        <sku>Standard</sku>
        <appName>ms-identity-spring-boot-webapp</appName>
        <isPublic>true</isPublic>
        <deployment>
            <cpu>1</cpu>
            <memoryInGB>2</memoryInGB>
            <instanceCount>1</instanceCount>
            <runtimeVersion>Java 11</runtimeVersion>
            <resources>
                <resource>
                    <directory>${project.basedir}/target</directory>
                    <includes>
                        <include>*.jar</include>
                    </includes>
                </resource>
            </resources>
        </deployment>
    </configuration>
</plugin>

Puede modificar las configuraciones de Azure Spring Apps directamente en el archivo pom.xml . Algunas configuraciones comunes se enumeran en la tabla siguiente:

Propiedad Obligatorio Descripción
subscriptionId false Identificador de la suscripción.
resourceGroup true El grupo de recursos de Azure para la instancia de Azure Spring Apps.
clusterName true Nombre del clúster de Azure Spring Apps. En caso de que use una suscripción y un grupo de recursos que ya tengan implementada una instancia de Azure Spring Apps, también puede usar este clúster existente para realizar la implementación.
appName true Nombre de la aplicación en Azure Spring Apps.
region false Región en la que se va a hospedar la instancia de Azure Spring Apps. El valor predeterminado es eastus. Para ver las regiones válidas, consulte Regiones admitidas.
sku false Plan de tarifa de la instancia de Azure Spring Apps. El valor predeterminado es Basic, que solo es adecuado para entornos de desarrollo y pruebas.
runtime false Configuración del entorno en runtime. Para obtener más información, consulte Detalles de configuración.
deployment false Configuración de implementación. Para obtener más información, consulte Detalles de configuración.

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 estas configuraciones, consulte Configuraciones comunes. Para conocer las configuraciones específicas de Azure Spring Apps, consulte Azure Spring Apps: Detalles de configuración.

Asegúrese de guardar los clusterName valores y appName para su uso posterior.

Preparación de la aplicación para la implementación

Al implementar la aplicación en Azure Spring Apps, la dirección URL de redireccionamiento cambia a la dirección URL de redireccionamiento de la instancia de aplicación implementada en Azure Spring Apps. Siga estos pasos para cambiar esta configuración en el archivo application.yml :

  1. Vaya al archivo src\main\resources\application.yml de la aplicación y cambie el valor de post-logout-redirect-uri por el nombre de dominio de la aplicación implementada, como se muestra en el ejemplo siguiente. Por ejemplo, si eligió cluster-ms-identity-spring-boot-webapp para la instancia de Azure Spring Apps en el paso anterior y ms-identity-spring-boot-webapp para el nombre de la aplicación, ahora debe usar https://cluster-ms-identity-spring-boot-webapp-ms-identity-spring-boot-webapp.azuremicroservices.io para el post-logout-redirect-uri valor .

    post-logout-redirect-uri: https://<cluster-name>-<app-name>.azuremicroservices.io
    
  2. Después de guardar este archivo, use el siguiente comando para volver a generar la aplicación:

    mvn clean package
    

Importante

El archivo application.yml de la aplicación contiene actualmente el valor del secreto de cliente en el client-secret parámetro . No es recomendable mantener este valor en este archivo. Es posible que también se esté arriesgando si lo confirma en un repositorio de Git.

Como paso de seguridad adicional, puede almacenar este valor en Azure Key Vault y cargar el secreto de Key Vault para que esté disponible en la aplicación.

Actualización del registro de la aplicación microsoft Entra ID

Dado que el URI de redirección cambia a la aplicación implementada en Azure Spring Apps, también debe cambiar el URI de redirección en el registro de la aplicación de Id. de Microsoft Entra. Para realizar este cambio, siga estos pasos:

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

  2. Use el cuadro 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 su nombre.

  4. Seleccione Autenticar desde el menú.

  5. En la sección URI de redirección web - , seleccione Agregar URI.

  6. Rellene el URI de la aplicación, anexando /login/oauth2/code/ , por ejemplo, https://<cluster-name>-<app-name>.azuremicroservices.io/login/oauth2/code/.

  7. Seleccione Guardar.

Implementar la aplicación

Use el siguiente comando para implementar la aplicación:

mvn azure-spring-apps:deploy

En la lista siguiente se describe la interacción del comando:

  • Inicio de sesión de OAuth2: debe autorizar el inicio de sesión a Azure en función del protocolo OAuth2.

Una vez ejecutado el comando, puede ver en los siguientes mensajes de registro que la implementación se ha realizado correctamente:

[INFO] Deployment(default) is successfully created
[INFO] Starting Spring App after deploying artifacts...
[INFO] Deployment Status: Running
[INFO]   InstanceName:demo-default-x-xxxxxxxxxx-xxxxx  Status:Running Reason:null       DiscoverStatus:UNREGISTERED
[INFO]   InstanceName:demo-default-x-xxxxxxxxx-xxxxx  Status:Terminating Reason:null       DiscoverStatus:UNREGISTERED
[INFO] Getting public url of app(demo)...
[INFO] Application url: https://<your-Azure-Spring-Apps-instance-name>-demo.azuremicroservices.io

Validación de la aplicación

Una vez finalizada la implementación, acceda a la aplicación con la dirección URL de la aplicación de salida. Siga estos pasos para comprobar los registros de la aplicación para investigar cualquier problema de implementación:

  1. Acceda a la dirección URL de la aplicación de salida desde la página Salidas de la sección Implementación .

  2. En el panel de navegación de la página Información general de la instancia de Azure Spring Apps, seleccione Registros para comprobar los registros de 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. Como alternativa, seleccione el vínculo a los detalles del token. Dado que esta página está protegida y requiere autenticación, se le redirigirá automáticamente a la página de inicio de sesión.
  3. En la página siguiente, siga las instrucciones e inicie sesión con una cuenta del proveedor de identidades elegido. También puede optar por registrarse o iniciar sesión en una cuenta local en el inquilino de B2C mediante una dirección de correo electrónico.
  4. Después de completar correctamente el flujo de inicio de sesión, debe redirigirse a la página principal ( que muestra el estado de inicio de sesión) o la página de detalles del token, en función del botón que desencadenó el flujo de inicio de sesión.
  5. Observe que el botón contextual ahora indica Cerrar sesión y muestra el nombre de usuario.
  6. Si está en la página principal, seleccione Id. Token Details (Detalles del token de identificador) para ver algunas de las notificaciones descodificadas del token de identificador.
  7. Edite el perfil. Seleccione Editar perfil para cambiar los detalles, como el nombre para mostrar, el lugar de residencia y la profesión.
  8. Use el botón de la esquina para cerrar la sesión. La página de estado refleja el nuevo estado.

Sobre el código

En este ejemplo se muestra cómo usar la biblioteca cliente de Spring Boot Starter de Azure AD B2C para Java para iniciar sesión de los usuarios en el inquilino de Azure AD B2C. El ejemplo también usa los inicios de spring Oauth2 Client y Spring Web Boot. En el ejemplo se usan notificaciones del token de identificador obtenido de Azure AD B2C para mostrar los detalles del usuario que ha iniciado sesión.

Contenido

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

Archivo/carpeta Descripción
pom.xml Dependencias de la aplicación.
src/main/resources/templates/ Plantillas de Thymeleaf para la interfaz de usuario.
src/main/resources/application.yml Configuración de la biblioteca de inicio de arranque de Aplicaciones y Microsoft Entra.
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ Este directorio contiene el punto de entrada, el controlador y las clases de configuración principales de la aplicación.
.../MsIdentitySpringBootWebappApplication.java Clase principal.
.../SampleController.java Controlador con asignaciones de puntos de conexión.
.../SecurityConfig.java Configuración de seguridad: por ejemplo, qué rutas requieren autenticación.
.../Utilities.java Clase de utilidad: por ejemplo, filtrar notificaciones de token de identificador.
CHANGELOG.md Lista de cambios en el ejemplo.
CONTRIBUTING.md Directrices para contribuir al ejemplo.
LICENCIA Licencia del ejemplo.

Notificaciones de token de identificador

Para extraer los detalles del token, la aplicación usa spring Security AuthenticationPrincipal y OidcUser el objeto en una asignación de solicitudes, como se muestra en el ejemplo siguiente, como se muestra en el ejemplo siguiente. Consulta el controlador de ejemplo para obtener los detalles completos de cómo esta aplicación usa notificaciones de token de identificador.

import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
    Map<String, Object> claims = principal.getIdToken().getClaims();
}

Para el inicio de sesión, la aplicación realiza una solicitud al punto de conexión de inicio de sesión de Azure AD B2C configurado automáticamente por la biblioteca cliente de Spring Boot Starter de Azure AD B2C para Java, como se muestra en el ejemplo siguiente:

<a class="btn btn-success" href="/oauth2/authorization/{your-sign-up-sign-in-user-flow}">Sign In</a>

Para cerrar sesión, la aplicación realiza una solicitud POST al logout punto de conexión, como se muestra en el ejemplo siguiente:

<form action="#" th:action="@{/logout}" method="post">
  <input class="btn btn-warning" type="submit" value="Sign Out" />
</form>

Elementos de la interfaz de usuario dependientes de la autenticación

La aplicación tiene cierta lógica sencilla en las páginas de plantilla de la interfaz de usuario para determinar el contenido que se va a mostrar en función de si el usuario está autenticado, como se muestra en el ejemplo siguiente mediante etiquetas Spring Security Thymeleaf:

<div sec:authorize="isAuthenticated()">
  this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
  this content only shows to not-authenticated users
</div>

Protección de rutas con WebSecurityConfigurerAdapter

De forma predeterminada, la aplicación protege la página Detalles del token de identificador para que solo los usuarios que hayan iniciado sesión puedan acceder a ella. La aplicación configura estas rutas desde la app.protect.authenticated propiedad del archivo application.yml . Para configurar los requisitos específicos de la aplicación, puede ampliar WebSecurityConfigurerAdapter en una de las clases. Para obtener un ejemplo, consulte la clase SecurityConfig de esta aplicación, que se muestra en el código siguiente:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${app.protect.authenticated}")
    private String[] protectedRoutes;

    private final AADB2COidcLoginConfigurer configurer;

    public SecurityConfig(AADB2COidcLoginConfigurer configurer) {
        this.configurer = configurer;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeRequests()
            .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details)
            .antMatchers("/**").permitAll()                  // allow all other routes.
            .and()
            .apply(configurer)
            ;
        // @formatter:off
    }
}

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.