首页 > 解决方案 > 输入正确的用户名和密码后登录无效

问题描述

    Try
        Dim connString As String = ConfigurationManager.ConnectionStrings("dbx").ConnectionString
        Dim cmdString As String = "SELECT * FROM Users WHERE UserName = @UserName AND Password = @Password"

        Using conn As New OleDbConnection(connString)
             Using cmd As New OleDbCommand(cmdString, conn)
                conn.Open()
                cmd.Parameters.AddWithValue("@UserName", TextBox1.Text)
                cmd.Parameters.AddWithValue("@Password", TextBox2.Text)

                Dim reader As OleDbDataReader = cmd.ExecuteReader
                dtRowsReturned.Load(reader)
            End Using
        End Using

        If dtRowsReturned.Rows.Count > 0 Then
            Me.Hide()
            Dim dss As New Form1()
            dss.ShowDialog()
        Else
            MessageBox.Show("Account/Password is incorrect Please try again", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If

    Catch ex As ApplicationException

        MessageBox.Show("Error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TextBox1.Clear()
        TextBox2.Clear()
        TextBox1.Focus()
    End Try
End Sub

Private Function IsValidated() As Boolean
    If TextBox1.Text.Trim = String.Empty Then
        MessageBox.Show("Account Required.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TextBox1.Focus()
        Return False
    End If
    If TextBox2.Text.Trim = String.Empty Then
        MessageBox.Show("Passwrd Requried.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TextBox2.Focus()
    End If

    Return False  
End Function

标签: vb.net

解决方案


我们看不到第一种方法的开始,但根据我们所看到的,我猜它会IsValidated()在继续之前检查函数。无处IsValidated()返回True,因此第一种方法的其余部分甚至永远不会尝试运行密码检查。IsValidated()应该看起来更像这样:

Private Function IsValidated() As Boolean
    If String.IsNullOrWhiteSpace(TextBox1.Text) Then
        MessageBox.Show("Account Required.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TextBox1.Focus()
        Return False
    End If
    If String.IsNullOrWhiteSpace(TextBox2.Text) Then
        MessageBox.Show("Passwrd Requried.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        TextBox2.Focus()
        Return False
    End If

    Return True
End Function

当我在这里时,将密码直接存储在数据库列中是绝对不行的。您需要为每个用户添加一个值列。当用户设置新密码时,您将盐值预先附加到密码中,然后针对结果运行加密哈希(如BCrypt)。然后您可以将该哈希值存储在数据库中。当有人尝试登录时,您将盐添加到他们尝试的密码中,运行相同的加密哈希算法,并将结果与​​存储在数据库中的哈希值进行比较。任何更少的东西都是不安全和业余的。

而这仅仅是开始。还需要考虑内存安全(即:)SecureString、传输安全、重置过程等。简而言之,您不想自己编写此代码,或者以任何方式参与构建您自己的身份验证系统。很容易得到看似正确的结果——甚至通过了严格的单元测试,但在微妙的方面是错误的,以至于一年后你发现你在六个月前被黑客入侵了。相反,请尽可能依赖您选择的平台已经提供的身份验证工具。


推荐阅读