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 tout en le modifiant.

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

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

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

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

ChangePassword exceptions si le mot de passe ne répond pas aux exigences définies dans Web.Config (longueur minimale, etc.). Mais il échoue seulement après que ResetPassword a été appelé, ainsi le mot de passe ne sera pas connu à l’utilisateur d’origine ou à la personne qui a essayé de le changer. 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 modifier et transmettre le mot de passe généré à ChangePassword .

 ssortingng 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 ces 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. Dans le cas contraire, une exception est générée.

Si vous avez besoin de la valeur RequiresQuestionAndAnswer définie sur true, vous pouvez utiliser cette solution de contournement

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é sur les articles ci-dessus fonctionne:

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

Mais vous devez définir requiresQuestionAndAnswer = “false” dans web.config dans la balise du fournisseur d’appartenance. Si c’est vrai, 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 en tant que paramètre à ResetPassword.

@Rob Church a raison:

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

Cependant, au lieu de sa solution pour effectuer la validation à la main, je voudrais essayer de changer le mot de passe en utilisant la méthode ResetPassword à partir de la méthode token et intercepter et afficher l’erreur:

 var user = UserManager.FindByName(User.Identity.Name); ssortingng token = UserManager.GeneratePasswordResetToken(user.Id); var result = UserManager.ResetPassword(user.Id, token, model.Password); if (!result.Succeeded){ // show error }