> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Personalizar Adaptive MFA

> Aprende a personalizar la autenticación multifactor adaptativa (MFA).

Puedes personalizar <Tooltip tip="Autenticación multifactor adaptativa: autenticación multifactor (MFA) que solo se activa para los usuarios cuando se determina que un intento de inicio de sesión tiene un nivel de confianza bajo." cta="Ver glosario" href="/es/docs/glossary?term=Adaptive+MFA">Adaptive MFA</Tooltip> para diversos escenarios con [Auth0 Actions](/es/docs/customize/actions).

<div id="when-to-customize-adaptive-mfa">
  ## Cuándo personalizar Adaptive MFA
</div>

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Solo deberías plantearte personalizar Adaptive MFA si tus usuarios están inscritos en MFA y deben usar un correo electrónico como identificador.
</Callout>

Si tus usuarios no están inscritos en <Tooltip tip="Autenticación multifactor (MFA): proceso de autenticación de usuarios que utiliza un factor adicional al nombre de usuario y la contraseña, como un código por SMS." cta="Ver glosario" href="/es/docs/glossary?term=MFA">MFA</Tooltip>, debes usar la política predeterminada de Adaptive MFA. Si un usuario no está inscrito en MFA y tu Action evalúa un riesgo alto, tienes opciones limitadas para detener a un <Tooltip tip="Actor malicioso: entidad (una persona o un grupo) que representa una amenaza para la empresa o el entorno con la intención de causar daño." cta="Ver glosario" href="/es/docs/glossary?term=bad+actor">actor malicioso</Tooltip>.

Antes de empezar a personalizar Adaptive MFA, hazte algunas preguntas:

* ¿A qué nivel de confianza quieres activar MFA?
* ¿Cómo quieres medir el riesgo?
* ¿Quieres que Auth0 mida el nivel de confianza o prefieres una medición personalizada?
* ¿Cómo gestionarás a los usuarios que no están inscritos en MFA?

<div id="confidence-scores">
  ## Puntuaciones de confianza
</div>

Adaptive MFA calcula una puntuación de confianza general a partir del análisis de tres evaluaciones: `NewDevice`, `ImpossibleTravel` y `UntrustedIP`. Para obtener más información, consulta [Adaptive MFA: Cómo funciona](/es/docs/secure/multi-factor-authentication/adaptive-mfa).

Cada evaluación tiene su propia puntuación de confianza, y cada puntuación de confianza tiene una acción asociada:

| Puntuación de confianza | Descripción                                                                                                                | Acción                          |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
| `low`                   | La transacción de inicio de sesión no coincide con los patrones que el usuario había mostrado anteriormente.               | Requerir MFA.                   |
| `medium`                | La transacción de inicio de sesión coincide en cierta medida con los patrones que el usuario había mostrado anteriormente. | No requerir MFA.                |
| `high`                  | La transacción de inicio de sesión coincide estrechamente con los patrones que el usuario había mostrado anteriormente.    | No requerir MFA.                |
| `neutral`               | N/A. Reservado para uso futuro.                                                                                            | N/A. Reservado para uso futuro. |

<Accordion title="Ver ejemplos de escenarios de alto y bajo riesgo con diferentes puntuaciones de confianza.">
  La siguiente tabla describe escenarios de alto riesgo que dan como resultado una puntuación de confianza `low`:

  | Estado del usuario | Fricción de inicio de sesión deseada         | Política de inscripción deseada                                   | Implementación                                                           |
  | ------------------ | -------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------ |
  | Inscrito en MFA    | No requerir MFA                              | N/A (el usuario ya está inscrito)                                 | Usar una Action para omitir MFA                                          |
  | No inscrito en MFA | Requerir verificación del correo electrónico | Omitir la inscripción (no solicitar autenticadores adicionales)   | Comportamiento predeterminado (sin Action relacionada con MFA)           |
  | No inscrito en MFA | Requerir verificación del correo electrónico | Requerir inscripción en MFA (solicitar un autenticador adicional) | Usar una Action para forzar la inscripción en MFA (plantilla disponible) |

  La siguiente tabla describe escenarios de bajo riesgo que dan como resultado una puntuación de confianza `high`:

  | Estado del usuario | Fricción de inicio de sesión deseada | Política de inscripción deseada                                   | Implementación                                                           |
  | ------------------ | ------------------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------ |
  | Inscrito en MFA    | Sin fricción                         | N/A (el usuario ya está inscrito)                                 | Comportamiento predeterminado (sin Action relacionada con MFA)           |
  | No inscrito en MFA | Sin fricción                         | Omitir la inscripción (no solicitar autenticadores adicionales)   | Comportamiento predeterminado (sin Action relacionada con MFA)           |
  | No inscrito en MFA | Sin fricción                         | Requerir inscripción en MFA (solicitar un autenticador adicional) | Usar una Action para forzar la inscripción en MFA (plantilla disponible) |
</Accordion>

Si quieres implementar tu propio método para evaluar la puntuación de confianza general en distintos escenarios, puedes usar los datos disponibles en el objeto `riskAssessment`, que contiene la puntuación de confianza general, información de versionado y detalles de las evaluaciones individuales.

Puedes consultar la descripción completa, las propiedades y los valores del objeto `riskAssessment` en la [referencia de `riskAssessment` del trigger `post-login` de Actions](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object#param-risk-assessment).

<div id="action-result-outcomes">
  ## Resultados de la Action
</div>

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Las Actions que activan MFA tienen prioridad sobre el comportamiento predeterminado de Adaptive MFA.
</Callout>

Si alguna de tus Actions activa MFA en función de la puntuación de confianza, la política predeterminada de Adaptive MFA activa MFA cuando la puntuación de confianza es `low`.

La siguiente tabla muestra los posibles resultados según la combinación de las Actions y las acciones de la política predeterminada de Adaptive MFA.

| Resultado de la Action | Acción de MFA adaptativa | Resultado          |
| ---------------------- | ------------------------ | ------------------ |
| No autorizado          | Activar MFA              | No autorizado      |
| No autorizado          | No se requiere MFA       | No autorizado      |
| Activar MFA            | Activar MFA              | Activar MFA        |
| Activar MFA            | No se requiere MFA       | Activar MFA        |
| No se requiere MFA     | Activar MFA              | Activar MFA        |
| No se requiere MFA     | No se requiere MFA       | No se requiere MFA |

<div id="action-templates">
  ## Plantillas de Action
</div>

Auth0 proporciona dos plantillas de Action basadas en Adaptive MFA para que las personalice: [Adaptive MFA](#adaptive-mfa-template) y [Requerir inscripción en MFA](#require-mfa-enrollment-template).

<div id="adaptive-mfa-template">
  ### Plantilla de Adaptive MFA
</div>

Esta plantilla proporciona un ejemplo y un punto de partida para crear un flujo de negocio personalizado mediante evaluaciones de riesgo individuales. Este ejemplo usa:

* El activador de Action [`api.multifactor.enable`](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-api-object#api-multifactor) para gestionar tanto la inscripción como los desafíos de MFA configurados al final del flujo de inicio de sesión.
* El activador de Actions [`event.user.multifactor`](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object) con los factores en los que se ha inscrito el usuario.

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Dado que las notificaciones de `email` no son un factor independiente, la condición `event.user.multifactor && event.user.multifactor.length > 0` devolverá `false` si el usuario solo tiene `email` como factor. Para obtener más información, consulta [Configurar notificaciones por correo electrónico para MFA](/es/docs/secure/multi-factor-authentication/multi-factor-authentication-factors/configure-email-notifications-for-mfa).
</Callout>

```javascript lines expandable theme={null}
/**
* Controlador que se llamará durante la ejecución de un flujo PostLogin.
*
* @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
* @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del inicio de sesión.
*/
exports.onExecutePostLogin = async (event, api) => {
    // Determina qué niveles de confianza deben activar MFA; para más información, consulta
    const promptConfidences = ['low', 'medium'];

    // Condición de ejemplo: solicitar MFA solo en función del nivel de confianza
    // de NewDevice; esto solicitará MFA cuando un usuario inicie sesión
    // desde un dispositivo desconocido.
    const confidence =
        event.authentication?.riskAssessment?.assessments?.NewDevice
            ?.confidence;
    const shouldPromptMfa =
        confidence && promptConfidences.includes(confidence);

    // Solo tiene sentido solicitar MFA cuando el usuario tiene al menos un
    // factor de MFA inscrito.
    const canPromptMfa =
        event.user.multifactor && event.user.multifactor.length > 0;
    if (shouldPromptMfa && canPromptMfa) {
        api.multifactor.enable('any', { allowRememberBrowser: true });
    }
};
```

Para solicitar MFA a los usuarios, reemplace `api.multifactor.enable` por `api.authentication.challengeWithAny()` para forzar una comprobación de MFA con un factor existente en el que el usuario ya esté inscrito. Para revisar los factores compatibles con Actions, consulte el [parámetro `factors`](https://auth0.com/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-api-object#api-authentication-challengewithany-factors). Por ejemplo:

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Este ejemplo usa `event.user.enrolledFactors` en lugar de `event.user.multifactor` para comprobar la inscripción. A diferencia de `event.user.multifactor`, `event.user.enrolledFactors` incluye `email` como factor, por lo que devuelve correctamente los factores en los que están inscritos los usuarios que solo tienen configurado el correo electrónico.
</Callout>

```javascript theme={null}
// Solo tiene sentido solicitar MFA cuando el usuario tiene al menos un
// factor de MFA inscrito.
const canPromptMfa = event.user.enrolledFactors && event.user.enrolledFactors.length > 0;

if (shouldPromptMfa && canPromptMfa) {
    api.authentication.challengeWithAny([ {type: "email"}, {type:"phone"} ]);
}
```

<div id="require-mfa-enrollment-template">
  ### Plantilla para requerir la inscripción en MFA
</div>

Esta plantilla muestra cómo podría exigir la inscripción en MFA al usar una política de MFA estándar o Adaptive MFA. Usa `event.user.multifactor` para comprobar si el usuario está inscrito en MFA y, si no lo está, solicita que se inscriba.

```javascript lines theme={null}
/**
* Controlador que se invocará durante la ejecución de un flujo PostLogin.
*
* @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
* @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del inicio de sesión.
*/
exports.onExecutePostLogin = async (event, api) => {
    if (!event.user.multifactor?.length) {
        api.multifactor.enable('any', { allowRememberBrowser: false });
    }
};
```

<div id="action-use-cases">
  ## Casos de uso de Action
</div>

Aquí tiene algunas sugerencias sobre cómo crear Actions personalizadas en función de su caso de uso.

<AccordionGroup>
  <Accordion title="Realizar una acción si la puntuación de confianza general es X">
    Evalúe la propiedad `riskAssessment.confidence` y compárela con las constantes `high`, `medium` o `low`:

    ```js lines theme={null}
    exports.onExecutePostLogin = async (event, api) => {
      const { riskAssessment } = event.authentication || {};
      const riskIsMedium = riskAssessment && riskAssessment.confidence === 'medium';

      if (riskIsMedium) {
        // ....
      }
    }
    ```
  </Accordion>

  <Accordion title="Realizar una acción si la puntuación de confianza está por encima o por debajo de X">
    Las puntuaciones de confianza son valores discretos, no un rango, por lo que no puede usar operadores de comparación (como `<` o `>`) para evaluar varios valores en una sola condición.

    Use varias condiciones para combinar lógicamente todas las puntuaciones de confianza que quiera controlar. Por ejemplo, si quiere saber cuándo la puntuación de confianza es mayor que `low`, compruebe si es igual a `medium` o `high`:

    ```js lines theme={null}
    exports.onExecutePostLogin = async (event, api) => {
      const { riskAssessment } = event.authentication || {};
      const riskIsMediumOrHigh = riskAssessment && 
                                      (riskAssessment.confidence === 'high' || 
                                       riskAssessment.confidence === 'medium');

      if (riskIsMediumOrHigh) {
        // ...
      }
    }
    ```
  </Accordion>

  <Accordion title="Obtener detalles adicionales si la puntuación de confianza general es X">
    El objeto `riskAssessment` se guarda en los registros de su inquilino. Puede consultar las entradas del registro para ver la puntuación de la evaluación de riesgo y los factores determinantes (motivos).

    También puede ver el objeto `riskAssessment` y registrar los resultados en otro lugar. Por ejemplo, puede enviar un correo electrónico o guardar un registro en una base de datos externa.

    ```js lines theme={null}
    exports.onExecutePostLogin = async (event, api) => {
      const { riskAssessment } = event.authentication || {};
      const riskIsLow = riskAssessment && riskAssessment.confidence === 'low';

      if (riskIsLow) {
        // log(externalDatabase, riskAssessment);
      }
    }
    ```
  </Accordion>

  <Accordion title="Realizar una acción si una evaluación específica tiene un resultado específico">
    Use el [objeto `assessments`](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object#param-assessments) para acceder a los detalles de cada evaluación, incluida la propiedad `code`:

    ```js lines theme={null}
    exports.onExecutePostLogin = async (event, api) => {
      const { riskAssessment } = event.authentication || {};
      const { ImpossibleTravel } = riskAssessment && riskAssessment.assessments;

      if (ImpossibleTravel.code === 'impossible_travel_from_last_login') {
        // ...
      }
    }
    ```
  </Accordion>

  <Accordion title="Agregar evaluaciones para obtener una puntuación de confianza general personalizada.">
    Use el [objeto `assessments`](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object#param-assessments) para acceder a los detalles de cada evaluación y, luego, use la propiedad `confidence`, la propiedad `code` o ambas.
  </Accordion>

  <Accordion title="Bloquear la transacción actual y devolver un error y un mensaje si una evaluación específica tiene un resultado específico">
    Use el [objeto `assessments`](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object#param-assessments) para acceder a los detalles de cada evaluación, incluida la propiedad `code`.

    Bloquee la transacción de inicio de sesión para impedir que se complete devolviendo un objeto `UnauthorizedError` como [parámetro de error](/es/docs/troubleshoot/error-handling-best-practices). El objeto `UnauthorizedError` siempre establece `error` en `unauthorized`, pero puede personalizar `error_message`:

    ```js lines theme={null}
    exports.onExecutePostLogin = async (event, api) => {
      const { riskAssessment } = event.authentication || {};
      const { ImpossibleTravel } = riskAssessment && riskAssessment.assessments;

      if (ImpossibleTravel.code === 'impossible_travel_from_last_login') {
        return api.access.deny('Login blocked due to impossible travel detected.')
      }
    }
    ```

    Esto redirige al usuario a la URL de callback de la aplicación con los parámetros `error` y `error_message` incluidos.
  </Accordion>

  <Accordion title="Manejar de forma segura los casos en que Auth0 no pueda ejecutar evaluaciones">
    Auth0 asigna automáticamente una puntuación de confianza `low` si se produce algún tipo de error al realizar la evaluación de riesgo.

    Para mitigar este escenario, use el [objeto `assessments`](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object#param-assessments) para inspeccionar la propiedad `code` de cada evaluación y comprobar si el valor está establecido en `assessment_not_available`.
  </Accordion>
</AccordionGroup>

<div id="learn-more">
  ## Más información
</div>

* [Habilite Adaptive MFA](/es/docs/secure/multi-factor-authentication/adaptive-mfa/enable-adaptive-mfa)
* [Eventos de registro de Adaptive MFA](/es/docs/secure/multi-factor-authentication/adaptive-mfa/adaptive-mfa-log-events)
* [Disparadores de Actions: post-login - Objeto de API](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-api-object)
* [Disparadores de Actions: post-login - Objeto de evento](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object)
