wake-up-neo.net

asp.net Mitgliedschaft Passwort ändern, ohne das alte zu kennen

Beim Auswerten der Methodensignatur ist es erforderlich, das alte Kennwort zu kennen, wenn Sie es ändern.

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

Gibt es eine Möglichkeit, das Passwort zu ändern, ohne das alte zu kennen.

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

Die anderen Antworten hier sind korrekt, können jedoch das Kennwort in einem unbekannten Zustand belassen.

ChangePassword löst Ausnahmen aus, wenn das Kennwort nicht den in Web.Config festgelegten Anforderungen entspricht (Mindestlänge usw.). Es schlägt jedoch erst nach dem Aufruf von ResetPassword fehl, so dass das Passwort dem ursprünglichen Benutzer oder der Person, die es geändert hat, nicht bekannt ist. Überprüfen Sie die Komplexitätsanforderungen, bevor Sie das Kennwort ändern, um dies zu vermeiden:

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

Sie müssen das Kennwort des Benutzers vor dem Ändern zurücksetzen und das generierte Kennwort an ChangePassword übergeben.

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

oder inline:

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

Versuchen Sie SimpleMembershipProvider zu verwenden, es ist einfacher:

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

Bitte beachten Sie, dass alle genannten Lösungen nur funktionieren, wenn die RequiresQuestionAndAnswer -Eigenschaft in der Mitgliedschaftssystemkonfiguration auf false gesetzt ist. Wenn RequiresQuestionAndAnswer true ist, muss der ResetPassword-Methode die Sicherheitsantwort übergeben werden, andernfalls wird eine Ausnahme ausgelöst.

Falls Sie RequiresQuestionAndAnswer auf true setzen müssen, können Sie diese Workaround verwenden.

4
Kate Moskalenko

Verwenden Sie das Kennwort, das Sie anstelle von 123456 aus dem Textfeld festlegen möchten. 

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

Dieser in den obigen Beiträgen erwähnte Code funktioniert:

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

Sie müssen jedoch in Mitgliedschaftsanbieter-Tag in der Datei web.config den Wert von requestQuestionAndAnswer = "false" festlegen. Wenn dies der Fall ist, generiert die resetpassword-Methode einen Fehler "Wert kann nicht null sein" . In diesem Fall müssen Sie als Parameter für Rückfrage eine Antwort angeben.

1
IvoAtanasov

@Rob Church hat recht:

Die anderen Antworten hier sind korrekt, können jedoch das Passwort in einer .__ hinterlassen. unbekannter Zustand.

Anstelle seiner Lösung, die Validierung von Hand durchzuführen, würde ich jedoch versuchen, das Kennwort mit der ResetPassword-Methode von Token zu ändern und den Fehler abzufangen und anzuzeigen:

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