Saltar al contenido principal
Puedes personalizar para diversos escenarios con Auth0 Actions.

Cuándo personalizar Adaptive MFA

Solo deberías plantearte personalizar Adaptive MFA si tus usuarios están inscritos en MFA y deben usar un correo electrónico como identificador.
Si tus usuarios no están inscritos en , 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 . 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?

Puntuaciones de confianza

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. Cada evaluación tiene su propia puntuación de confianza, y cada puntuación de confianza tiene una acción asociada:
Puntuación de confianzaDescripciónAcción
lowLa transacción de inicio de sesión no coincide con los patrones que el usuario había mostrado anteriormente.Requerir MFA.
mediumLa transacción de inicio de sesión coincide en cierta medida con los patrones que el usuario había mostrado anteriormente.No requerir MFA.
highLa transacción de inicio de sesión coincide estrechamente con los patrones que el usuario había mostrado anteriormente.No requerir MFA.
neutralN/A. Reservado para uso futuro.N/A. Reservado para uso futuro.
La siguiente tabla describe escenarios de alto riesgo que dan como resultado una puntuación de confianza low:
Estado del usuarioFricción de inicio de sesión deseadaPolítica de inscripción deseadaImplementación
Inscrito en MFANo requerir MFAN/A (el usuario ya está inscrito)Usar una Action para omitir MFA
No inscrito en MFARequerir verificación del correo electrónicoOmitir la inscripción (no solicitar autenticadores adicionales)Comportamiento predeterminado (sin Action relacionada con MFA)
No inscrito en MFARequerir verificación del correo electrónicoRequerir 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 usuarioFricción de inicio de sesión deseadaPolítica de inscripción deseadaImplementación
Inscrito en MFASin fricciónN/A (el usuario ya está inscrito)Comportamiento predeterminado (sin Action relacionada con MFA)
No inscrito en MFASin fricciónOmitir la inscripción (no solicitar autenticadores adicionales)Comportamiento predeterminado (sin Action relacionada con MFA)
No inscrito en MFASin fricciónRequerir inscripción en MFA (solicitar un autenticador adicional)Usar una Action para forzar la inscripción en MFA (plantilla disponible)
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.

Resultados de la Action

Las Actions que activan MFA tienen prioridad sobre el comportamiento predeterminado de Adaptive MFA.
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 ActionAcción de MFA adaptativaResultado
No autorizadoActivar MFANo autorizado
No autorizadoNo se requiere MFANo autorizado
Activar MFAActivar MFAActivar MFA
Activar MFANo se requiere MFAActivar MFA
No se requiere MFAActivar MFAActivar MFA
No se requiere MFANo se requiere MFANo se requiere MFA

Plantillas de Action

Auth0 proporciona dos plantillas de Action basadas en Adaptive MFA para que las personalice: Adaptive MFA y Requerir inscripción en MFA.

Plantilla de Adaptive MFA

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 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 con los factores en los que se ha inscrito el usuario.
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.
/**
* 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. Por ejemplo:
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.
// 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"} ]);
}

Plantilla para requerir la inscripción en MFA

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.
/**
* 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 });
    }
};

Casos de uso de Action

Aquí tienes algunas sugerencias para crear Actions personalizadas en función de tu caso de uso.
Evalúe la propiedad riskAssessment.confidence y compárela con las constantes high, medium o low:
exports.onExecutePostLogin = async (event, api) => {
  const { riskAssessment } = event.authentication || {};
  const riskIsMedium = riskAssessment && riskAssessment.confidence === 'medium';

  if (riskIsMedium) {
    // ....
  }
}
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:
exports.onExecutePostLogin = async (event, api) => {
  const { riskAssessment } = event.authentication || {};
  const riskIsMediumOrHigh = riskAssessment && 
                                  (riskAssessment.confidence === 'high' || 
                                   riskAssessment.confidence === 'medium');

  if (riskIsMediumOrHigh) {
    // ...
  }
}
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.
exports.onExecutePostLogin = async (event, api) => {
  const { riskAssessment } = event.authentication || {};
  const riskIsLow = riskAssessment && riskAssessment.confidence === 'low';

  if (riskIsLow) {
    // log(externalDatabase, riskAssessment);
  }
}
Use el objeto assessments para acceder a los detalles de cada evaluación, incluida la propiedad code:
exports.onExecutePostLogin = async (event, api) => {
  const { riskAssessment } = event.authentication || {};
  const { ImpossibleTravel } = riskAssessment && riskAssessment.assessments;

  if (ImpossibleTravel.code === 'impossible_travel_from_last_login') {
    // ...
  }
}
Use el objeto assessments para acceder a los detalles de cada evaluación y, luego, use la propiedad confidence, la propiedad code o ambas.
Use el objeto 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. El objeto UnauthorizedError siempre establece error en unauthorized, pero puede personalizar error_message:
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.
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 para inspeccionar la propiedad code de cada evaluación y comprobar si el valor está establecido en assessment_not_available.

Más información