Членство в asp.net меняет пароль, не зная старого - PullRequest
57 голосов
/ 16 февраля 2011

Для оценки подписи метода необходимо знать старый пароль при его изменении.

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

Можно ли изменить пароль, не зная старого.

Ответы [ 8 ]

111 голосов
/ 16 февраля 2011
 string username = "username";
 string password = "newpassword";
 MembershipUser mu = Membership.GetUser(username);
 mu.ChangePassword(mu.ResetPassword(), password);
23 голосов
/ 14 мая 2014

Другие ответы здесь верны, но могут оставить пароль в неизвестном состоянии.

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
}
14 голосов
/ 16 февраля 2011

Вам необходимо сбросить пароль пользователя перед его изменением и передать сгенерированный пароль на ChangePassword.

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

или в строке:

membershipUser.ChangePassword(membershipUser.ResetPassword(), userWrapper.Password)
4 голосов
/ 04 декабря 2013

Обратите внимание, что все эти упомянутые решения будут работать, только если для свойства RequiresQuestionAndAnswer установлено значение false в конфигурации системы Членства.Если RequiresQuestionAndAnswer равно true, тогда метод ResetPassword должен быть передан секретным ответом, в противном случае он выдаст исключение.

В случае, если для RequiresQuestionAndAnswer установлено значение true, вы можете использовать этот обходной путь

4 голосов
/ 09 сентября 2013

Попробуйте использовать SimpleMembershipProvider, это проще:

var token = WebSecurity.GeneratePasswordResetToken("LoginOfUserToChange");
WebSecurity.ResetPassword(token, "YourNewPassword");
1 голос
/ 11 июля 2017

Этот код, упомянутый в постах выше, работает:

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

Но вы должны установить requireQuestionAndAnswer = "false" в web.config в теге поставщика членства. Если это правда, метод resetpassword генерирует ошибку «Значение не может быть нулевым». В этом случае вы должны предоставить ответ на вопрос в качестве параметра ResetPassword.

1 голос
/ 01 марта 2012

Используйте пароль, который вы хотите установить из текстового поля вместо 123456.

 MembershipUser user;     
 user = Membership.GetUser(userName,false);
 user.ChangePassword(user.ResetPassword(),"123456");
0 голосов
/ 30 апреля 2017

@ Роб Черч прав:

Другие ответы здесь верны, но могут оставить пароль в неизвестном состоянии.

Однако вместо его решениявыполнить проверку вручную, я бы попытался изменить пароль с помощью метода 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...