tables - Contraseña de restablecimiento de identidad de ASP.NET
asp.net membership vs identity (7)
¿O cómo puedo restablecer sin conocer el actual (usuario olvidó la contraseña)?
Si desea cambiar una contraseña utilizando el UserManager pero no desea proporcionar la contraseña actual del usuario, puede generar un token de restablecimiento de contraseña y luego usarlo de inmediato.
string resetToken = await UserManager.GeneratePasswordResetTokenAsync(model.Id);
IdentityResult passwordChangeResult = await UserManager.ResetPasswordAsync(model.Id, resetToken, model.NewPassword);
¿Cómo puedo obtener la contraseña de un usuario en el nuevo sistema de identidad ASP.NET? ¿O cómo puedo restablecer sin conocer el actual (usuario olvidó la contraseña)?
Obsoleto
Esta fue la respuesta original. Funciona, pero tiene un problema. ¿Qué AddPassword
si AddPassword
falla? El usuario se queda sin una contraseña.
La respuesta original: podemos usar tres líneas de código:
UserManager<IdentityUser> userManager =
new UserManager<IdentityUser>(new UserStore<IdentityUser>());
userManager.RemovePassword(userId);
userManager.AddPassword(userId, newPassword);
Vea también: http://msdn.microsoft.com/en-us/library/dn457095(v=vs.111).aspx
Ahora recomendado
Probablemente sea mejor usar la respuesta que EdwardBrey propuso y luego DanielWright luego elaboró con una muestra de código.
Crear método en UserManager<TUser, TKey>
public Task<IdentityResult> ChangePassword(int userId, string newPassword)
{
var user = Users.FirstOrDefault(u => u.Id == userId);
if (user == null)
return new Task<IdentityResult>(() => IdentityResult.Failed());
var store = Store as IUserPasswordStore<User, int>;
return base.UpdatePassword(store, user, newPassword);
}
En caso de restablecer la contraseña, se recomienda restablecerla mediante el envío del token de restablecimiento de la contraseña al correo electrónico del usuario registrado y pedirle al usuario que proporcione una nueva contraseña. Si se ha creado una biblioteca .NET de fácil uso sobre el marco Identity con configuraciones predeterminadas. Puede encontrar detalles en el enlace del blog y el código fuente en github.
En su UserManager
, primero llame a GeneratePasswordResetTokenAsync . Una vez que el usuario ha verificado su identidad (por ejemplo, al recibir el token en un correo electrónico), pase el token a ResetPasswordAsync .
En la versión actual
Suponiendo que haya manejado la verificación de la solicitud para restablecer la contraseña olvidada, use el siguiente código como un ejemplo de pasos de código.
ApplicationDbContext =new ApplicationDbContext()
String userId = "<YourLogicAssignsRequestedUserId>";
String newPassword = "<PasswordAsTypedByUser>";
ApplicationUser cUser = UserManager.FindById(userId);
String hashedNewPassword = UserManager.PasswordHasher.HashPassword(newPassword);
UserStore<ApplicationUser> store = new UserStore<ApplicationUser>();
store.SetPasswordHashAsync(cUser, hashedNewPassword);
En AspNet Nightly Build
El marco se actualiza para funcionar con Token para manejar solicitudes como ForgetPassword. Una vez en lanzamiento, se espera una guía de código simple.
Actualizar:
Esta actualización es solo para proporcionar pasos más claros.
ApplicationDbContext context = new ApplicationDbContext();
UserStore<ApplicationUser> store = new UserStore<ApplicationUser>(context);
UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(store);
String userId = User.Identity.GetUserId();//"<YourLogicAssignsRequestedUserId>";
String newPassword = "test@123"; //"<PasswordAsTypedByUser>";
String hashedNewPassword = UserManager.PasswordHasher.HashPassword(newPassword);
ApplicationUser cUser = await store.FindByIdAsync(userId);
await store.SetPasswordHashAsync(cUser, hashedNewPassword);
await store.UpdateAsync(cUser);
string message = null;
//reset the password
var result = await IdentityManager.Passwords.ResetPasswordAsync(model.Token, model.Password);
if (result.Success)
{
message = "The password has been reset.";
return RedirectToAction("PasswordResetCompleted", new { message = message });
}
else
{
AddErrors(result);
}
Este fragmento de código se toma del proyecto AspNetIdentitySample disponible en github