【问题标题】:ASP.Net user forgets password and answer to security quest ionASP.Net 用户忘记密码和安全问题的答案
【发布时间】:2014-07-20 11:57:15
【问题描述】:

这种情况时有发生。有没有一种简单的方法可以以编程方式为用户重置密码,而无需知道安全问题的答案或他们的原始密码。我现在有一个非常麻烦的方法。

我打开 aspnet_Membership 表并只显示我的行和他们的行。我将我的密码和密码盐复制到他们的行中。我现在已将他们的密码设置为与我的相同。我现在可以调用下面的两行代码来将他们的密码重置为他们想要的任何值。

有没有一种方法可以重置他们的密码,而无需先将其设置为我的密码?

格雷格

Dim user As MembershipUser = Membership.GetUser("{Their username}")
user.ChangePassword("{My password}", "{Their new password}")

【问题讨论】:

    标签: asp.net passwords asp.net-membership


    【解决方案1】:

    也许这有点小技巧,但它确实有效。我得到了通用密码“密码!”的密码和盐。我使用密码的哈希版本更新用户的成员资格表!。然后我用它来将他们的密码重置为新密码,因为我现在知道他们当前的密码是 Password!。

    现在,如果我能弄清楚为什么我必须单击该按钮两次才能使其工作。第一次什么都没有触发,然后我再次单击它就可以了。

    格雷格

        Try
            'Get the user
            Dim user As MembershipUser = Membership.GetUser(Server.HtmlEncode(txtUserName.Text))
    
            'Build a SQL string to reset their password to Password!
            Dim sSQL As String = "UPDATE  [dbo].[aspnet_Membership]"
            sSQL &= " SET [Password] = 'p4p+zOnsA+if4+F7oVcmR8Y0yiM='" 'Hash for Password! 
            sSQL &= " ,[PasswordSalt] = 'URJfTNqAlfa+5TsNxFe7Uw=='" 'Salt for Password!
            sSQL &= " WHERE [ApplicationId] = '{Your Application ID Here}' AND UserID = '" & user.ProviderUserKey.ToString & "'"
    
            'Reset their password in the aspnet_membership table to Password!
            Dim dbconn = New SqlConnection(ConfigurationManager.ConnectionStrings("{Your Membership Connection Here}").ConnectionString)
            dbconn.Open()
            Dim dbCommand As SqlCommand = dbconn.CreateCommand
            dbCommand.Connection = dbconn
    
            dbCommand.CommandText = sSQL
            dbCommand.ExecuteNonQuery()
            dbCommand.Dispose()
            dbconn.Close()
    
            'Now reset their password to the new password useing Password! as the known password
            user.ChangePassword("Password!", Server.HtmlEncode(txtNewPassword.Text))
            lblMsgInfo.Text = "The password was reset."
    
        Catch ex As Exception
            lblMsgInfo.Text = "Error: " & ex.Message
        End Try
    

    【讨论】:

      【解决方案2】:

      您可以使用ResetPassword 来做到这一点:

      MembershipUser mu = Membership.GetUser(UserIdToChangePass);
      
      if (mu != null)
      {
          string sLastPassword = mu.ResetPassword();
          mu.ChangePassword(sLastPassword, txtNewPassword.Text);
      }
      

      【讨论】:

      • 对我来说,string sLastPassword = mu.ResetPassword() 会抛出“值不能为空。参数名称:passwordAnswer”的异常。这就是为什么我改变了我笨重的方式。格雷格
      • @user1091524 请阅读 MSDN 上的备注并在需要的地方进行小改动 msdn.microsoft.com/en-us/library/d94bdzz2(v=vs.110).aspx - 您也许可以暂时关闭 RequiresQuestionAndAnswer 或以编程方式更改您的数据库并添加一个众所周知的密码您现在可以,但不是手动操作。
      • 我知道 RequiresQuestionAndAnswer 作为 的一部分,但我想我希望能够在有人忘记密码和答案的时候覆盖。只需重置密码并继续。格雷格
      • @user1091524 您也可以直接从数据库中读取秘密答案并将其提供给ResetPassword。
      • 它是散列的。我想我可以测试一下,但是 ResetPassword 会采用散列形式的答案吗?似乎不会。格雷格
      猜你喜欢
      • 2011-07-31
      • 2011-12-02
      • 1970-01-01
      • 2011-03-18
      • 2015-05-21
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多