【问题标题】:asp.net membership change password without knowing old oneasp.net会员更改密码不知道旧密码
【发布时间】:2011-06-28 04:28:23
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:
     string username = "username";
     string password = "newpassword";
     MembershipUser mu = Membership.GetUser(username);
     mu.ChangePassword(mu.ResetPassword(), password);
    

    【讨论】:

    • 请注意,enablePasswordReset 选项必须在 web.config 成员资格提供程序配置中启用
    • 为什么不能只使用 mu.GetPassword();而不是 mu.ResetPassword(); ?
    • @RMiranda 您可以使用 GetPassword,但前提是您将加密的密码存储在数据库中,此时您应该对其进行哈希处理:security.blogoverflow.com/2011/11/…
    【解决方案2】:

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

    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
    }
    

    【讨论】:

    • 即使在今天,这也是一个有效且有见地的评论(对于我正在处理的遗留代码)。谢谢。
    【解决方案3】:

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

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

    或内联:

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

    【讨论】:

    【解决方案4】:

    尝试使用 SimpleMembershipProvider 会更简单:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        上面帖子中提到的这段代码正在运行:

        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。

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            @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
            }
            

            【讨论】:

            • 这里的主题是使用旧会员。但是您的代码来自新的 Asp.Net Identity。 :)
            【解决方案9】:
            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>"); 
                    }
                }
            

            【讨论】:

            • 欢迎来到 StackOverflow。也请提供一些解释。
            【解决方案10】:
             string username = "UserName";
             string userpassword = "NewPassword";   
             MembershipUser mu = Membership.GetUser(username, false);
             mu.ChangePassword(mu.ResetPassword(username), userpassword);
            

            【讨论】:

            • 这是对您其他答案的编辑吗?使用帖子下方的编辑链接并删除此链接。
            猜你喜欢
            • 2023-03-24
            • 1970-01-01
            • 2011-04-15
            • 2011-09-10
            • 2011-11-21
            • 2011-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多