Оценивая сигнатуру метода, при ее изменении требуется знать старый пароль.
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
Есть ли способ сменить пароль, не зная старого.
Оценивая сигнатуру метода, при ее изменении требуется знать старый пароль.
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
Есть ли способ сменить пароль, не зная старого.
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
Другие ответы здесь верны, но могут оставить пароль в неизвестном состоянии.
ChangePassword
будет генерировать исключения, если пароль не соответствует требованиям, изложенным в Web.Config(минимальная длина и т.д.). Но он терпит неудачу только после вызова ResetPassword
, поэтому пароль не будет известен первоначальному пользователю или человеку, который попытался его изменить. Перед изменением пароля проверьте требования к сложности, чтобы избежать этого:
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
}
Вам необходимо reset пароль пользователя перед его заменой и передать сгенерированный пароль на ChangePassword
.
string randompassword = membershipUser.ResetPassword();
membershipUser.ChangePassword(randompassword , userWrapper.Password)
или inline:
membershipUser.ChangePassword(membershipUser.ResetPassword(), userWrapper.Password)
Попробуйте проще использовать SimpleMembershipProvider:
var token = WebSecurity.GeneratePasswordResetToken("LoginOfUserToChange");
WebSecurity.ResetPassword(token, "YourNewPassword");
Обратите внимание, что все упомянутые решения будут работать, только если для свойства RequiresQuestionAndAnswer
установлено значение false в конфигурации системы членства. Если RequiresQuestionAndAnswer
истинно, то метод ResetPassword должен быть передан ответ безопасности, иначе он выдает исключение.
Если вам нужно RequiresQuestionAndAnswer
установить значение true, вы можете использовать этот обходной путь
Используйте пароль, который вы хотите установить из текстового поля вместо 123456.
MembershipUser user;
user = Membership.GetUser(userName,false);
user.ChangePassword(user.ResetPassword(),"123456");
Этот код, упомянутый выше в сообщениях, работает:
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
Но вы должны установить requireQuestionAndAnswer = "false" в web.config в теге поставщика членства. Если это так, метод resetpassword генерирует ошибку "Значение не может быть null". В этом случае вы должны предоставить ответ вопроса в качестве параметра ResetPassword.
Церковь @Rob права:
Другие ответы здесь верны, но могут оставить пароль в неизвестное состояние.
Однако вместо его решения выполнить проверку вручную, я попытался бы изменить пароль, используя метод ResetPassword из токена, и поймать и показать ошибку:
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
}