asp.net membresía cambiar contraseña sin conocer la antigua


Evaluando la firma del método, se requiere conocer la contraseña antigua mientras la cambia.

membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)

Hay alguna manera de cambiar la contraseña sin conocer la antigua.

Author: Artem Koshelev, 2011-02-16

8 answers

 string username = "username";
 string password = "newpassword";
 MembershipUser mu = Membership.GetUser(username);
 mu.ChangePassword(mu.ResetPassword(), password);
 104
Author: ajma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-16 08:11:18

Las otras respuestas aquí son correctas, pero pueden dejar la contraseña en un estado desconocido.

ChangePassword lanzará excepciones si la contraseña no cumple con los requisitos establecidos en Web.Config (longitud mínima, etc.). Pero solo falla después de que ResetPassword ha sido llamado, por lo que la contraseña no será conocida por el usuario original o por la persona que ha intentado cambiarla. Compruebe 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
}
 21
Author: Rob Church,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-14 12:33:13

Necesita 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)
 14
Author: Geoff Appleford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-16 08:05:42

Intenta usar SimpleMembershipProvider es más fácil:

var token = WebSecurity.GeneratePasswordResetToken("LoginOfUserToChange");
WebSecurity.ResetPassword(token, "YourNewPassword");
 4
Author: Jake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-09 11:43:15

Tenga en cuenta que todas estas soluciones mencionadas solo funcionarán si la propiedad RequiresQuestionAndAnswer está establecida en false en la configuración del sistema de membresía. Si RequiresQuestionAndAnswer es true, entonces el método ResetPassword necesita pasar la respuesta de seguridad, de lo contrario lanzará una excepción.

En caso de que necesite RequiresQuestionAndAnswer establecer en true, puede usar esta solución

 4
Author: Kate Moskalenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-04 19:13:38

Utilice 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");
 1
Author: ankit rajput,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-01 05:43:21

Este código mencionado en los mensajes anteriores está funcionando:

string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);

Pero tienes que establecer requiresQuestionAndAnswer="false" en web.configuración en la etiqueta de proveedor de membresía. Si es true, el método resetpassword genera un error "Value can not be null". En este caso, debe proporcionar la respuesta de la pregunta como parámetro para ResetPassword.

 1
Author: IvoAtanasov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-11 08:31:31

@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, intentaría cambiar la contraseña utilizando el método ResetPassword de token y capturar 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
}
 0
Author: Potcoava Mihai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-30 07:59:39