将身份验证信息发送到 SQL Server 不起作用 (C#)



我已经问过类似的问题,但我已经把它缩小到了我的问题,我已经为此工作了几个小时,但无法解决这个问题。

基本上,我有一个visualstudiowep应用程序,我正在尝试使用登录页和sql server数据库来验证用户凭据。用户在登录屏幕上输入用户名和密码的字符串,该字符串将在代码后面发送到此处:

private bool ValidateUser(string userName, string passWord)
        {
            SqlConnection conn;
            SqlCommand cmd;
            string lookupPassword = null;

                // Consult with your SQL Server administrator for an appropriate connection
                // string to use to connect to your local SQL Server.
                conn = new SqlConnection(ConfigurationManager.ConnectionStrings["databaseConnect"].ConnectionString);
                conn.Open();
                // Create SqlCommand to select pwd field from users table given supplied userName.
                cmd = new SqlCommand("Select Password from Users where User=@userName;", conn);
                cmd.Parameters.Add("@userName", System.Data.SqlDbType.VarChar, 25);
                cmd.Parameters["@userName"].Value = userName;
                lookupPassword = (string)cmd.ExecuteScalar();
            // If no password found, return false.
                 if (null == lookupPassword)
                 {
                     return false;
                 }
private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
          if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
           (logs in)
      }

应用程序连接到数据库中的一个表,该表当前包含一个测试项,如下所示:https://i.stack.imgur.com/Xa7kH.jpg

然而,当我输入"test"作为用户名,输入"password"作为密码时,它不接受登录。

我试着只包含我代码的相关部分,让任何试图回答这个问题的人都更清楚,但这里有一些关于我问题的评论:

-当我将if(null==lookupPassword)设置为"return true"而不是"return false"时,应用程序允许登录这意味着在"lookupPassword=(string)cmd.ExecuteScaler();"之后lookupPassword仍然为空

-当我将if(ValidateUser(txtUserName.Value,txtUserPass.Value))更改为if(userName=test,passWord=passWord)时,应用程序运行良好。因此,问题不在于登录应用程序的实际操作,而在于找不到SQL Server凭据是真的。

-"databaseConnect"正在应用程序的其他地方工作,所以这不是问题所在。

-当我提交登录凭据时,应用程序并没有崩溃,它只是不接受它们的正确性。

除此之外,在我看来,问题来自这四条线:

cmd = new SqlCommand("Select Password from Users where User=@userName;", conn);
cmd.Parameters.Add("@userName", System.Data.SqlDbType.VarChar, 25);
cmd.Parameters["@userName"].Value = userName;
lookupPassword = (string)cmd.ExecuteScalar();

有人知道我的问题在哪里吗?我对编程很陌生,所以请尽可能简单地回答。提前感谢您的帮助。:)

此表设计在SQL Server中使用了几个保留字。如果您不能修改这个模式,您可以如下更新您的查询:

SELECT [Password] FROM [Users] WHERE [User] = @Username

话虽如此,以明文形式存储密码是一种可怕的安全做法。密码永远不应该被加密或明文存储,应该使用salt对它们进行哈希处理,以避免彩虹表破解您的密码。我会研究@Richard关于Rfc2898DeriveBytes的建议。你也可以在谷歌或必应上搜索salt和SHA256。

相关内容

最新更新