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?.
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
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
}
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)
Essayez d'utiliser SimpleMembershipProvider c'est plus facile:
var token = WebSecurity.GeneratePasswordResetToken("LoginOfUserToChange");
WebSecurity.ResetPassword(token, "YourNewPassword");
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
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");
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.
@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
}