Mejores prácticas para los métodos de administración de identidad con respecto a la confirmación de la existencia del usuario

3

Estoy trabajando en un nuevo sitio que usa la identidad asp.net para registrar usuarios. Estoy haciendo uso de las direcciones de correo electrónico como nombres de usuario y la dirección de correo electrónico debe confirmarse antes de que el usuario pueda iniciar sesión.

He estado trabajando de acuerdo con las especificaciones y nuestra política de administración de contraseñas de la organización. La combinación de los 2 me daría varios mensajes detallados a un usuario al realizar acciones relacionadas con la cuenta, por ejemplo:

  • Al seleccionar "Contraseña olvidada" para un nombre de usuario que no existe, aparece el mensaje: Este nombre de usuario no existe.

He estado pensando que la mejor práctica sería no confirmar ni negar si existe la dirección de correo electrónico. Por este motivo, quiero mostrar el mensaje de éxito: "Las instrucciones sobre cómo proceder se enviaron a la dirección de correo electrónico proporcionada" incluso cuando el usuario que se proporcionó no existe.

Sin embargo, aplicar este principio a otras acciones relacionadas con la cuenta es un poco complicado. Por ejemplo; de acuerdo con la especificación al seleccionar Reenviar el correo electrónico de confirmación de una cuenta que ya está confirmada, debería mostrar el mensaje: "Esta cuenta ya está activada". Eso allí mismo muestra a cualquier otro usuario anónimo que existe la cuenta. Ahora, si muestro el mensaje de éxito, el usuario puede sentarse y esperar el correo electrónico, lo que significa que en realidad debería enviarle un correo electrónico. En caso de que este correo electrónico sea el correo electrónico de activación habitual, o uno que indique: "Su cuenta ya está activada. Abra el sitio e inicie sesión".

Otro problema es al registrarse. Si muestro un mensaje genérico de "Intento de registro no válido" al registrarme con una cuenta existente, mi servicio de atención podría estar inundado de llamadas de usuarios enojados. (De acuerdo, probablemente no esté inundado, pero después de la primera, la mesa de servicio descubre que el usuario se comunicó con ellos debido a un mensaje de error genérico para un problema específico e identificado; Sin embargo, una vez más, si le muestro un mensaje al usuario indicando que la cuenta ya existe, volveremos a empezar.

Además, cuando un usuario inicia sesión 5 veces incorrectamente, debo bloquear su cuenta. Si le digo que su cuenta está bloqueada, este es otro medio por el cual una persona anónima puede confirmar si el nombre de usuario existe o no.

He buscado literatura en línea con pautas sobre estas interacciones, pero no he encontrado mucho.

    
pregunta Carel 19.05.2015 - 08:52
fuente

2 respuestas

2

Sí, tienes razón. En cada caso, puede enviar un correo electrónico a la dirección ingresada detallando cualquier éxito / fracaso y se puede mostrar una respuesta genérica al usuario en la página de respuesta.

Esto se conoce como comunicación a través de un canal "fuera de enlace". Por lo tanto, siempre envía el correo electrónico, pero es el correo electrónico en sí mismo el que explica la situación actual, y la página HTML le pide al usuario que verifique su cuenta de correo electrónico.

Vea mi otra respuesta aquí para obtener más información sobre esto y cómo puede combinar cualquier registro de usuario con olvidado funcionalidad de contraseña.

Una cosa a tener en cuenta es que debe enviar la respuesta exactamente igual de la aplicación, ya sea que la cuenta exista o no. Esto significa exactamente los mismos encabezados HTTP y cuerpo de HTML, no solo una respuesta que aparece igual a primera vista.

  

Además, cuando un usuario inicia sesión 5 veces incorrectamente, debo bloquear su cuenta.

También debe dar la misma respuesta si un atacante logra "bloquear" una cuenta inexistente. es decir, se ha bloqueado el acceso ficticio a la cuenta con la dirección de correo electrónico inexistente.

Un mejor enfoque que también evitaría cualquier ataque DoS a un usuario (por otro usuario que deniegue el acceso mediante el bloqueo intencional de una cuenta) sería la limitación de la respuesta. es decir, la respuesta HTTP se retrasa cada vez más, lo que detendría los ataques automáticos de adivinación de contraseñas, pero no bloquearía al usuario.

por ejemplo El primer intento incorrecto de un nombre de usuario da un retraso de un segundo. El segundo intento incorrecto da dos segundos. Expanda esto a un valor razonable para su aplicación. p.ej. un máximo de 16 segundos. Implementar esto a través de hilos para evitar ataques paralelos y habrá reducido significativamente la velocidad de un atacante sin riesgo de DoS en el usuario válido.

  

pero después de la primera, la mesa de servicio descubre que el usuario los contactó debido a un mensaje de error genérico para un problema específico e identificado, me solicitarán a mí, oa cualquier desarrollador, que corrija el mensaje de error para mostrarle al usuario cuál es el problema. problema es

Debería usar un sistema de administración de casos (si aún no lo ha hecho). Simplemente marque estos errores como "no se implementará" porque tienen implicaciones en la seguridad.

    
respondido por el SilverlightFox 21.05.2015 - 14:43
fuente
4

He estado pensando que la mejor práctica sería no confirmar ni negar si existe la dirección de correo electrónico. Por este motivo, quiero mostrar el mensaje de éxito: "Las instrucciones sobre cómo proceder se enviaron a la dirección de correo electrónico proporcionada" incluso cuando el usuario que se proporcionó no existe.

Sí, esta es la forma correcta de hacerlo. Un mensaje mejor sería "Si esta dirección de correo electrónico existe, las instrucciones sobre cómo proceder se enviaron a la dirección de correo electrónico proporcionada". Es más fácil de usar sin dar a un intruso la información de si existe la cuenta.

En caso de que este correo electrónico sea el correo electrónico de activación habitual, o uno que indique: "Su cuenta ya está activada. Abra el sitio e inicie sesión".

El último.

Si muestro un mensaje genérico de "Intento de registro no válido" al registrarme con una cuenta existente, mi servicio de atención podría estar inundado de llamadas de usuarios enojados.

En este caso, debe mostrar en pantalla un mensaje "La información se ha enviado a la dirección de correo electrónico proporcionada. Siga las instrucciones". y correo electrónico al usuario "Alguien (quizás usted) ha intentado registrarse con esta cuenta de correo electrónico, pero ya existe una cuenta vinculada a esta dirección de correo electrónico".

Además, cuando un usuario inicia sesión 5 veces incorrectamente, debo bloquear su cuenta.

Esto es más complicado ya que podría usarse para un DoS (aunque, dado que el atacante no sabe si la cuenta existe o no, solo puede probar las direcciones de correo electrónico al azar). Debe tener un segundo método de autenticación (por ejemplo, un número de teléfono móvil o una segunda dirección de correo electrónico) donde pueda notificar al usuario "Su cuenta ha sido bloqueada debido a 5 intentos de autenticación fallidos" y permitirle que se vuelva a autenticar de alguna otra manera, tal vez con un nonce. EDITAR: Esto también debería usarse para restablecer la contraseña.

Una forma más suave de mitigar los inicios de sesión incorrectos sería negar el acceso durante 24 horas, en lugar de bloquear la cuenta.

    
respondido por el dr01 19.05.2015 - 09:46
fuente

Lea otras preguntas en las etiquetas