users two password net mvc factor aspnet asp c# .net asp.net-mvc identity password-recovery

two - reset password c# mvc



¿Cómo implemento el restablecimiento de contraseña con ASP.NET Identity para ASP.NET MVC 5.0? (2)

Microsoft está creando un nuevo sistema de membresía llamado ASP.NET Identity (también el predeterminado en ASP.NET MVC 5). Encontré el proyecto de ejemplo , pero esto no es un restablecimiento de contraseña implementado.

En el tema de restablecimiento de contraseña, acabo de encontrar este artículo: Implementación de confirmación de usuario y restablecimiento de contraseña con One ASP.NET Identity - Dolor o placer , no es una ayuda para mí, porque no use la recuperación de contraseña integrada.

Mientras miraba las opciones, creo que necesitamos generar un token de reinicio, que enviaré al usuario. El usuario puede establecer entonces la nueva contraseña usando el token, sobrescribiendo la antigua.

Encontré el IdentityManager.Passwords.GenerateResetPasswordToken / IdentityManager.Passwords.GenerateResetPasswordTokenAsync(string tokenId, string userName, validUntilUtc) , pero no pude entender qué podría significar el parámetro tokenId .

¿Cómo implemento el restablecimiento de contraseña en ASP.NET con MVC 5.0?


Lo entiendo: el tokenid es una identidad elegida libremente, que identifica una opción de contraseña. Por ejemplo,

1. se parece al proceso de recuperación de contraseña, paso 1 (se basa en: https://.com/a/698879/208922 )

[HttpPost] [ValidateAntiForgeryToken] [AllowAnonymous] //[RecaptchaControlMvc.CaptchaValidator] public virtual async Task<ActionResult> ResetPassword( ResetPasswordViewModel rpvm) { string message = null; //the token is valid for one day var until = DateTime.Now.AddDays(1); //We find the user, as the token can not generate the e-mail address, //but the name should be. var db = new Context(); var user = db.Users.SingleOrDefault(x=>x.Email == rpvm.Email); var token = new StringBuilder(); //Prepare a 10-character random text using (RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider()) { var data = new byte[4]; for (int i = 0; i < 10; i++) { //filled with an array of random numbers rngCsp.GetBytes(data); //this is converted into a character from A to Z var randomchar = Convert.ToChar( //produce a random number //between 0 and 25 BitConverter.ToUInt32(data, 0) % 26 //Convert.ToInt32(''A'')==65 + 65 ); token.Append(randomchar); } } //This will be the password change identifier //that the user will be sent out var tokenid = token.ToString(); if (null!=user) { //Generating a token var result = await IdentityManager .Passwords .GenerateResetPasswordTokenAsync( tokenid, user.UserName, until ); if (result.Success) { //send the email ... } } message = "We have sent a password reset request if the email is verified."; return RedirectToAction( MVC.Account.ResetPasswordWithToken( token: string.Empty, message: message ) ); }

2 Y luego, cuando el usuario ingresa el token y la nueva contraseña:

[HttpPost] [ValidateAntiForgeryToken] [AllowAnonymous] //[RecaptchaControlMvc.CaptchaValidator] public virtual async Task<ActionResult> ResetPasswordWithToken( ResetPasswordWithTokenViewModel rpwtvm ) { if (ModelState.IsValid) { string message = null; //reset the password var result = await IdentityManager.Passwords.ResetPasswordAsync( rpwtvm.Token, rpwtvm.Password ); if (result.Success) { message = "the password has been reset."; return RedirectToAction( MVC.Account.ResetPasswordCompleted(message: message) ); } else { AddErrors(result); } } return View(MVC.Account.ResetPasswordWithToken(rpwtvm)); }

Propuesta esquelética para muestrear un proyecto en github, si alguien lo necesita, puede ser probado. El envío de correo electrónico aún no está escrito, posiblemente con la adición pronto.


Parece un montón de problemas ... ¿Qué ventaja cede la anterior?

  1. el usuario haciendo clic en el enlace ''Recuperar cuenta''
  2. esto envía una cadena codificada de 64 bytes de un valor de tics de fecha y hora (llámelo psuedo-hash) en un correo electrónico
  3. haga clic en el enlace de nuevo en el correo electrónico a una ruta de controlador / acción que
  4. hace coincidir el correo electrónico y su servidor de origen con psuedo-hash, descifra el psuedo-hash, valida el tiempo desde que se envió y
  5. ofrece una vista para que el usuario establezca una nueva contraseña
  6. con una contraseña válida, el código elimina la contraseña de usuario anterior y asigna la nueva.
  7. Una vez completado, exitoso o no, elimine el psuedo-hash.

Con este flujo, en ningún momento envías NUNCA una contraseña fuera de tu dominio.

Por favor, cualquiera, demuéstrame que esto es menos seguro.