asp.net会员更改密码而不知道旧密码

时间:2011-02-16 08:01:09

标签: asp.net asp.net-membership forgot-password change-password

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

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

有没有办法在不知道旧密码的情况下更改密码。

10 个答案:

答案 0 :(得分:107)

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

答案 1 :(得分:23)

此处的其他答案是正确的,但可以将密码保留为未知状态。

如果密码不符合Web.Config中规定的要求(最小长度等),

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
}

答案 2 :(得分:14)

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

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

或内联:

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

答案 3 :(得分:4)

尝试使用SimpleMembershipProvider更容易:

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

答案 4 :(得分:4)

请注意,所有这些提到的解决方案仅在成员资格系统配置中将RequiresQuestionAndAnswer属性设置为false时才有效。如果RequiresQuestionAndAnswer为真,那么需要通过ResetPassword方法传递安全性答案,否则会抛出异常。

如果您需要将RequiresQuestionAndAnswer设置为true,则可以使用此workaround

答案 5 :(得分:1)

使用您要从文本框设置的密码代替123456.

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

答案 6 :(得分:1)

上述帖子中提到的此代码正在运行:

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

但是您必须在成员资格提供程序标记中的web.config中设置requiresQuestionAndAnswer =“false”。如果为true,则resetpassword方法会生成错误“Value not not null”。 在这种情况下,您必须提供问题答案作为ResetPassword的参数。

答案 7 :(得分:0)

@Rob Church是对的:

  

这里的其他答案是正确的,但可以保留密码   未知状态。

但是,我会尝试使用令牌方法中的ResetPassword更改密码而不是他的解决方案来手动进行验证,并捕获并显示错误:

'9' > '10'

答案 8 :(得分: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>"); 
        }
    }

答案 9 :(得分:0)

 string username = "UserName";
 string userpassword = "NewPassword";   
 MembershipUser mu = Membership.GetUser(username, false);
 mu.ChangePassword(mu.ResetPassword(username), userpassword);