Tengo una aplicación web protegida por contraseña (ASP.NET 4.5) y un requisito de que cuando un usuario registrado accede al sitio desde un dispositivo por primera vez, debo autorizar ese acceso enviando un código de autorización al correo electrónico del usuario. , y validando que él / ella puede devolver el código correcto.
No es obligatorio, pero se considera bueno si el usuario no tiene que autorizar el dispositivo cuando accede al sitio utilizando dos navegadores diferentes en la misma máquina.
Una vez que el dispositivo está autorizado, el sistema no debe solicitar al usuario una autorización hasta que haya expirado algún período, por ejemplo, un mes.
La solución también debe ser tolerante para la comunidad de IP dinámica, y no debe seguir solicitando autorización, solo porque la IP visible para el mundo exterior ha cambiado.
Aquí está cómo funciona mi solución actual, pero aparentemente tiene algunas debilidades.
Dependo principalmente de la dirección IP del usuario para detectar si se trata de un dispositivo nuevo (no usé la cadena de User Agent, ya que parecen cambiar cuando se actualizan los navegadores).
- Cuando llega una solicitud, verifico si hay una cookie que indique que el dispositivo ya está autorizado por este usuario, si es así la solicitud puede continuar.
- Si una cookie no está presente, verifico en la base de datos local para ver si el usuario ha obtenido una autorización para esta IP, ingresando correctamente un código enviado por correo electrónico.
- Si se encuentra el registro de autorización, para recordar la autorización de este dispositivo (y no para volver a preguntar si cambia la IP), creo una cookie en el navegador del cliente, programada para caducar en un mes, o el tiempo restante en el que se obtuvo. autorización.
- Si no se encuentra una cookie ni una autorización en la base de datos, el usuario será redirigido a una página, donde podrá solicitar que se envíe un nuevo código a su correo electrónico. Una vez que se solicita el código, el usuario es enviado a una segunda página, donde puede ingresar el código que se le envió por correo electrónico.
- Si se ingresa el código correcto en la segunda página, el registro correspondiente se actualiza para reflejar la autorización y el usuario es redirigido nuevamente a la página original a la que intentó acceder.
- Ahora volveremos a dar el primer paso, encontraremos el registro autorizado en la base de datos local y crearemos la cookie.
- Otras solicitudes deberían proceder normalmente ya que ahora hay una cookie en la solicitud.
Mis preguntas son:
- ¿Algún problema obvio en esta solución, a lo que he estado ciego?
- ¿Existen herramientas / marcos que podrían ser útiles para implementar este tipo de requisitos?
- ¿Alguna de las mejores prácticas / patrones / anti-patrones que no conozco aplicables a este tipo de escenarios?