web-dev-qa-db-fra.com

adhésion asp.net changer le mot de passe sans connaître l'ancien

En évaluant la signature de la méthode, il est nécessaire de connaître l'ancien mot de passe lors de sa modification.

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

Est-il possible de changer le mot de passe sans connaître l'ancien?.

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

Les autres réponses ici sont correctes, mais peuvent laisser le mot de passe dans un état inconnu.

ChangePassword lancera des exceptions si le mot de passe ne répond pas aux exigences définies dans Web.Config (longueur minimale, etc.). Mais il n'échoue que lorsque ResetPassword a été appelé. Le mot de passe ne sera donc pas connu de l'utilisateur d'origine ni de la personne qui a tenté de le modifier. Vérifiez les exigences de complexité avant de changer le mot de passe pour éviter ceci:

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
}
22
Rob Church

Vous devez réinitialiser le mot de passe de l'utilisateur avant de le changer et transmettre le mot de passe généré à ChangePassword.

string randompassword = membershipUser.ResetPassword();
membershipUser.ChangePassword(randompassword , userWrapper.Password)

ou en ligne:

membershipUser.ChangePassword(membershipUser.ResetPassword(), userWrapper.Password)
14
Geoff Appleford

Essayez d'utiliser SimpleMembershipProvider c'est plus facile:

var token = WebSecurity.GeneratePasswordResetToken("LoginOfUserToChange");
WebSecurity.ResetPassword(token, "YourNewPassword");
4
Jake

Veuillez noter que toutes les solutions mentionnées ne fonctionneront que si la propriété RequiresQuestionAndAnswer est définie sur false dans la configuration du système d’appartenance. Si RequiresQuestionAndAnswer est true, la réponse de sécurité doit être transmise à la méthode ResetPassword, sinon une exception sera générée.

Si vous avez besoin que RequiresQuestionAndAnswer soit défini sur true, vous pouvez utiliser cette solution workaround

4
Kate Moskalenko

Utilisez le mot de passe que vous souhaitez définir dans la zone de texte à la place de 123456. 

 MembershipUser user;     
 user = Membership.GetUser(userName,false);
 user.ChangePassword(user.ResetPassword(),"123456");
1
ankit rajput

Ce code mentionné dans les messages ci-dessus fonctionne:

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

Mais vous devez définir requireQuestionAndAnswer = "false" dans web.config dans la balise du fournisseur d'appartenance. Si elle est vraie, la méthode resetpassword génère une erreur "La valeur ne peut pas être nulle" . Dans ce cas, vous devez fournir la réponse à la question comme paramètre à ResetPassword.

1
IvoAtanasov

@Rob Church a raison:

Les autres réponses ici sont correctes mais peuvent laisser le mot de passe dans un état inconnu.

Cependant, au lieu de sa solution pour faire la validation à la main, j'essayerais de changer le mot de passe en utilisant la méthode ResetPassword de token et attraper et montrer l'erreur:

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
Potcoava Mihai