60

评估方法签名,更改旧密码时需要知道旧密码。

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

有什么方法可以在不知道旧密码的情况下更改密码。

4

10 回答 10

117
 string username = "username";
 string password = "newpassword";
 MembershipUser mu = Membership.GetUser(username);
 mu.ChangePassword(mu.ResetPassword(), password);
于 2011-02-16T08:06:16.330 回答
24

这里的其他答案是正确的,但会使密码处于未知状态。

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
}
于 2014-05-14T12:33:13.457 回答
14

您需要在更改之前重置用户密码,并将生成的密码传递给ChangePassword.

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

或内联:

membershipUser.ChangePassword(membershipUser.ResetPassword(), userWrapper.Password)
于 2011-02-16T08:05:42.190 回答
4

尝试使用 SimpleMembershipProvider 它更容易:

var token = WebSecurity.GeneratePasswordResetToken("LoginOfUserToChange");
WebSecurity.ResetPassword(token, "YourNewPassword");
于 2013-09-09T11:43:15.037 回答
4

请注意,所有这些提到的解决方案只有RequiresQuestionAndAnswer在会员系统配置中将该属性设置为 false 时才有效。如果RequiresQuestionAndAnswer为真,则需要向 ResetPassword 方法传递安全答案,否则将引发异常。

如果您需要RequiresQuestionAndAnswer设置为 true,则可以使用此解决方法

于 2013-12-04T18:58:38.167 回答
2

上面帖子中提到的这段代码正在工作:

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

但是您必须在会员提供者标签的 web.config 中设置 requiresQuestionAndAnswer="false"。如果为真,resetpassword 方法会生成错误“Value can not be null”。在这种情况下,您必须将问题答案作为参数提供给 ResetPassword。

于 2017-07-11T08:31:31.357 回答
1

使用要从文本框中设置的密码代替 123456。

 MembershipUser user;     
 user = Membership.GetUser(userName,false);
 user.ChangePassword(user.ResetPassword(),"123456");
于 2012-03-01T05:43:21.620 回答
0

@Rob Church 是对的:

这里的其他答案是正确的,但会使密码处于未知状态。

但是,我将尝试使用令牌方法中的 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
}
于 2017-04-30T07:59:39.157 回答
0
string username = "UserName";
string userpassword = "NewPassword";
string resetpassword;
    
MembershipUser mu = Membership.GetUser(username, false);

if (mu == null){
    Response.Write("<script>alert('Invalid Username!')</script>"); 
}

else{
    resetpassword = mu.ResetPassword(username);
    if (resetpassword != null){
         if (mu.ChangePassword(resetpassword, userpassword)){
             Response.Write("<script>alert('Password changed successfully!')</script>"); 
         }
    }
    else{
           Response.Write("<script>alert('Oh some error occurred!')</script>"); 
        }
    }
于 2020-07-28T15:03:04.587 回答
0
 string username = "UserName";
 string userpassword = "NewPassword";   
 MembershipUser mu = Membership.GetUser(username, false);
 mu.ChangePassword(mu.ResetPassword(username), userpassword);
于 2020-07-28T15:18:18.077 回答