La membresía asp.net cambia la contraseña sin saber la anterior
asp.net-membership forgot-password (8)
Al evaluar la firma del método, es necesario conocer la contraseña anterior al cambiarla.
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
¿Hay alguna forma de cambiar la contraseña sin saber la anterior?
@Rob Church tiene razón:
Las otras respuestas aquí son correctas pero pueden dejar la contraseña en un estado desconocido.
Sin embargo, en lugar de su solución para hacer la validación a mano, trataría de cambiar la contraseña usando el método ResetPassword from token y atrapar y mostrar el error:
var user = UserManager.FindByName(User.Identity.Name);
string token = UserManager.GeneratePasswordResetToken(user.Id);
var result = UserManager.ResetPassword(user.Id, token, model.Password);
if (!result.Succeeded){
// show error
}
Este código mencionado en las publicaciones anteriores funciona:
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
Pero debe establecer requireQuestionAndAnswer = "false" en web.config en la etiqueta del proveedor de membresía. Si es verdadero, el método resetpassword generará un error "El valor no puede ser nulo". En este caso, debe suministrar la respuesta a la pregunta como parámetro a ResetPassword.
Intenta usar SimpleMembershipProvider, es más fácil:
var token = WebSecurity.GeneratePasswordResetToken("LoginOfUserToChange");
WebSecurity.ResetPassword(token, "YourNewPassword");
Las otras respuestas aquí son correctas, pero pueden dejar la contraseña en un estado desconocido.
ChangePassword
arrojará excepciones si la contraseña no cumple con los requisitos establecidos en Web.Config (longitud mínima, etc.). Pero solo falla después de ResetPassword
llamado a ResetPassword
, por lo que el usuario original o la persona que intentó cambiar la contraseña no la conocerán. Verifique los requisitos de complejidad antes de cambiar la contraseña para evitar esto:
var user = Membership.GetUser(userName, false);
if ((newPassword.Length >= Membership.MinRequiredPasswordLength) &&
(newPassword.ToCharArray().Count(c => !Char.IsLetterOrDigit(c)) >=
Membership.MinRequiredNonAlphanumericCharacters) &&
((Membership.PasswordStrengthRegularExpression.Length == 0) ||
Regex.IsMatch(newPassword, Membership.PasswordStrengthRegularExpression))) {
user.ChangePassword(user.ResetPassword(), newPassword);
} else {
// Tell user new password isn''t strong enough
}
Tenga en cuenta que todas estas soluciones mencionadas solo funcionarán si la propiedad RequiresQuestionAndAnswer
está configurada en falso en la configuración del sistema de Membresía. Si RequiresQuestionAndAnswer
es verdadero, entonces el método ResetPassword necesita pasar la respuesta de seguridad, de lo contrario lanzará una excepción.
En caso de que necesite RequiresQuestionAndAnswer
establecido en true, puede usar esta solución
Use la contraseña que desea establecer desde el cuadro de texto en lugar de 123456.
MembershipUser user;
user = Membership.GetUser(userName,false);
user.ChangePassword(user.ResetPassword(),"123456");
ChangePassword
restablecer la contraseña del usuario antes de cambiarla y pasar la contraseña generada a ChangePassword
.
string randompassword = membershipUser.ResetPassword();
membershipUser.ChangePassword(randompassword , userWrapper.Password)
o en línea:
membershipUser.ChangePassword(membershipUser.ResetPassword(), userWrapper.Password)
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);