mexico hostgator etiquetas clientes url passwords reset

hostgator - url temporal cpanel



Generar URL temporal para restablecer la contraseƱa (8)

Estoy buscando implementar una característica de Olvidé mi contraseña en mi sitio web. Me gusta la opción en la que un correo electrónico que contiene una URL temporal de uso único que caduca después de un tiempo se envía al usuario.

He consultado las siguientes páginas para obtener estas ideas, pero no estoy seguro de cómo implementar esto usando ASP.NET y C #. Como indicó uno de los usuarios, si puedo implementar esto sin almacenar esta información dentro de la base de datos, será ideal. Por favor avise.

Restablecimiento de contraseña enviando contraseñas temporales por correo electrónico

Gracias.


@Alex

También puede usar las clases de System.Security.Cryptography en .NET para los algoritmos de hash. Por ejemplo:

using System.Security.Cryptography; ... var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash); ...


Aquí, la clase System.Guid en tu amigo, ya que generará un número único (bueno, lo suficientemente único) de 128 bits:

  • Generar un nuevo Guid (System.Guid.NewGuid ())
  • Almacene ese Guid en algún lugar (¿Objeto de aplicación quizás?)
  • Enviar una URL personalizada en un correo electrónico con ese Guid
  • Cuando el usuario acceda al sitio, haga que ingrese la contraseña que envió en el correo electrónico.
  • Si las contraseñas coinciden, adelante y forzarlas a ingresar una nueva contraseña

Definitivamente incluiría la base de datos en este proceso. Una vez que se solicita un restablecimiento, es una buena idea indicar que la cuenta está bloqueada.

Por ejemplo, si está cambiando su pw porque piensa que su cuenta se ha visto comprometida, definitivamente no desea que permanezca accesible mientras realiza el proceso de cambio.

Además, la inclusión de información "real" en el token de reinicio podría decodificarse si alguien realmente lo quiere y tiene los caballos de fuerza. Sería más seguro generar una cadena aleatoria, guardarla en el archivo db en la fila para ese usuario y, a continuación, devolverla cuando se haga clic en el enlace.

Esto te da dos cosas:

1) No hay nada que descifrar y, por lo tanto, nada de valor se puede obtener de él. 2) La presencia del token en el registro del usuario indica que el restablecimiento está en progreso y que la cuenta debe tratarse como bloqueada.


Dependiendo de sus necesidades, puede encriptar información, en un formato similar al siguiente formato

(UserId)-(ExpireDate)

Cifre los datos, haga que el enlace, luego descifre los datos y tome medidas desde allí ...

Crudo, pero probablemente usable, y que no requiera el uso de DB


El objetivo de enviar datos | cadena al correo electrónico del usuario es la validación del propietario de la cuenta. Por favor, cuídate de algunos puntos:

  • Evite enviar información importante al reiniciar o activar el enlace.
  • Es la mejor manera de almacenar una conjunción única de datos de cadena con la cuenta de usuario y enviarla como ese enlace. pero tenga en cuenta que si envía solo una sección como enlace al correo electrónico del usuario y solo lo revisa en la página, su aplicación puede estar en peligro por fuerza bruta o por ataque de diccionario. Es suficiente verificar una lista de cadenas para encontrar algunos enlaces y cambiar la contraseña. Sé que tiene una pequeña posibilidad, pero no cero.

Resultado: creo que es mejor si

  1. combine el correo electrónico del usuario con el enlace de cadena y luego cifre (no hash porque el valor del hash no puede ser inverso) y envíelo al correo electrónico del usuario.
  2. El usuario hace clic y su página obtiene el valor encriptado.
  3. descifrar el valor
  4. extraer correo electrónico del usuario.
  5. encontrar el correo electrónico en la base de datos.
  6. compare la cadena del enlace recibido con otra adjunta al correo electrónico del usuario en la base de datos.

Buena suerte.


Probablemente la forma más fácil sea modificar la tabla de usuarios para agregar 2 columnas adicionales O, si no desea modificar la tabla existente, puede agregar una nueva tabla dependiente llamada "UserPasswordReset" o algo así. Las columnas son así:

PasswordResetToken UNIQUEIDENTIFIER, PasswordResetExpiration DATETIME

Si va con la ruta de la tabla adicional, también puede agregar la columna UserID, convertirla en una clave principal y una referencia de clave foriegn en la tabla de usuarios. También se recomienda una restricción ÚNICA. Luego simplemente usa un Guid en su aplicación asp.net como token.

El flujo podría ser algo como esto:

  1. El usuario solicita el restablecimiento de contraseña para su cuenta
  2. Inserta un nuevo registro en la tabla (o actualiza su registro de usuario) configurando PasswordResetExpiration en una fecha futura (DateTime.Now.AddDays (1)) y configura el token en Guid.NewGuid ()
  3. Envíe un correo electrónico al usuario con un enlace a su página ResetPassword.aspx con el guid en la cadena de consulta ( http://www.yoursite.com/ResetPassword.aspx?token=Guid-here )
  4. Use la página ResetPassword.aspx para validar los campos de token y de caducidad. (IE Asegúrese de DateTime.Now <PasswordResetExpiration)
  5. Proporcione un formulario simple que permita al usuario restablecer esta contraseña.

Sé que querías evitar modificar la base de datos, pero realmente es probablemente el método más simple.


Usé una clase Hashing para crear inicios de sesión automáticos únicos formados por la fecha / hora actual y la dirección de correo electrónico de los usuarios:

string strNow = DateTime.Now.ToString(); string strHash = strNow + strEmail; strHash = Hash.GetHash(strHash, Hash.HashType.SHA1);

obtener la clase Hash de: http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/

Entonces solo tómalo desde la URL usando:

if (Request.QueryString["hash"] != null) { //extract Hash from the URL string strHash = Request.QueryString["hash"]; }


Usaría un código hash para validar detalles en la URL de restablecimiento de contraseña. Todo esto se puede hacer sin escribir nada en el DB o enviar información privilegiada a un atacante.

Para explicar brevemente la contraseña normal de sal y hash; digamos que la sal es 1111 y la contraseña es password , concatenaría los dos y 1111password la contraseña 1111 , digamos que esto le da un hash de 9999 , luego almacenaría el sal original 1111 y el hash 9999 en su registro de usuario.

Cuando está validando una contraseña, usa la sal almacenada, concatenar el intento de contraseña, hash it y comparar con el hash almacenado. Por ejemplo, 1111asecret convierte en 1111asecret pero hashes en 8888 . Esto no coincide con el hash original, por lo que la coincidencia de contraseña falla.

Por supuesto, la sal y el hash normalmente se generarían correctamente y se calcularían con las criptobibliotecas establecidas (¡no inventes la tuya propia!).

Para la URL de restablecimiento de contraseña, pondría el identificador único para el usuario, es decir, la dirección de correo electrónico, la fecha en que se realiza la solicitud y un nuevo hash. Este hash se generaría a partir de los detalles concatenados más la sal y el hash ya almacenados para el usuario.

Por ejemplo:

Email: [email protected] Request Date: 2014-07-17 Salt: 1111 Hash: 9999

Genere un nuevo hash de los concatenados, es decir, ''[email protected]'' , diga que esto da un hash de 7777 .

La URL que genere luego tendrá el correo electrónico, la fecha de solicitud y el nuevo hash:

https://www.example.com/[email protected]&requestdate=2014-07-17&hash=7777

El servidor combinará el correo electrónico y la fecha de suministro con sal y hash y confirmará que el hash que generó es el mismo que el proporcionado. Si esto está bien, entonces mostrará el formulario de reinicio con los mismos tres parámetros ocultos detrás, de lo contrario un error. Éstos se vuelven a enviar y se vuelven a comprobar cuando se ingresa la nueva contraseña para evitar que se falsifique el formulario.

La dirección de correo electrónico debe enviarse para realizar la solicitud y solo se envía por correo electrónico a la misma dirección. la fecha no es información privilegiada y el hash no es reversible, por lo que no ofrece nada. No se ha escrito nada en la base de datos y cualquier alteración de los parámetros hace que el hash falle y la URL informe un error.