asp.net членство изменить пароль, не зная старый
оценивая сигнатуру метода, необходимо знать старый пароль при его изменении.
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
есть ли способ изменить пароль, не зная старого.
8 ответов
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
другие ответы здесь верны, но могут оставить пароль в неизвестном состоянии.
ChangePassword
будет выдавать исключения, если пароль не соответствует требованиям, изложенным в Интернете.Конфигурации (минимальная длина и т. д.). Но он терпит неудачу только после 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
}
вам нужно сбросить пароль пользователя перед его изменением и передать сгенерированный пароль в 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);
но вы должны установить requiresQuestionAndAnswer="false" в интернете.config в теге поставщика членства. Если это правда, метод resetpassword генерирует ошибку "значение не может быть null". В этом случае необходимо указать ответ на вопрос в качестве параметра ResetPassword.
@Rob Church прав:
другие ответы здесь верны, но могут оставить пароль в неизвестное состояние.
однако вместо его решения сделать проверку вручную, я бы попытался изменить пароль с помощью метода ResetPassword из token и поймать и показать ошибку:
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
}