如果您不知道当前密码,如何使用asp.net成员资格提供程序更改已哈希密码?

57

问题是,没有方法:

bool ChangePassword(string newPassword);

你需要知道当前的密码(可能已经被散列和遗忘了)。


你应该将问题和答案分开。 - Aaron Fischer
@mcqwerty,现在我们已经分离了您的答案,您应该"接受"您自己的答案。 - harriyott
干得好,我用我们的ChangePassword控件版本做到了(管理员为用户更改密码);) - CheGueVerra
再多投一票他就能获得一个徽章了,加油! - CheGueVerra
@harriyott 上次我尝试时,你不能接受自己的答案。 - chakrit
@CheGueVerra:迟到总比不来得好 :-) - Eric J.
2个回答

130

这是一个很简单的问题,但我浪费了太多时间。希望这篇文章能够帮助其他人避免像我一样狠狠拍自己的额头。

解决方法是随机重置密码并将其传递到更改方法中。

MembershipUser u = Membership.GetUser();
u.ChangePassword(u.ResetPassword(), "myAwesomePassword");

2
嘿,别这样。回答自己的问题不要被踩。FAQ鼓励这样做。请参见http://stackoverflow.com/questions/18557/how-does-stackoverflow-work-the-unofficial-faq#119658。 - DOK
如果您遇到上述错误,请确保在您的web.config中设置了以下属性:requiresQuestionAndAnswer="true" - Andrew
3
在找到这个答案之前,我浪费了很多时间,谢谢你。 - Frank Schwieterman
你能在文本框中使用这个吗?我一直在尝试,但无法让它正常工作。 - Jamie
+1 - 赞!在使用Membership.ChangePassword()时我也曾绕了一圈,然后发现了这个小技巧。 - jim tollan
显示剩余4条评论

2

如果requiresQuestionAndAnswer="true",则无法更改密码。

我找到了一个解决方法:

在web.config中创建了两个成员资格提供程序。

我正在使用AspNetSqlMembershipProviderReset提供程序重置密码,因为它的requiresQuestionAndAnswer = false,而AspNetSqlMembershipProvider是默认提供程序。

我编写了以下代码来重置用户的密码。

public bool ResetUserPassword(String psUserName, String psNewPassword) { try { // 使用第二个成员资格提供程序获取成员资格用户详细信息,其中需要问题答案设置为false。

        MembershipUser currentUser = Membership.Providers["AspNetSqlMembershipProviderReset"].GetUser(psUserName,false);

        //Reset the user password.
        String vsResetPassword = currentUser.ResetPassword();            

        //Change the User password with the required password            
        currentUser.ChangePassword(vsResetPassword, psNewPassword);
        //Changed the comments to to force the user to change the password on next login attempt
        currentUser.Comment = "CHANGEPASS";
        //Check if the user is locked out and if yes unlock the user
        if (currentUser.IsLockedOut == true)
        {
            currentUser.UnlockUser();
        }
        Membership.Providers["AspNetSqlMembershipProviderReset"].UpdateUser(currentUser);            return true;
    }
    catch (Exception ex)
    {
        throw ex;
        return false;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接