2014-09-04 39 views
0

我已经询问过类似的问题,但我已经缩小到我的问题,我一直在这个工作了几个小时,无法计算这一点。发送身份验证信息到SQL Server无法正常工作(C#)

基本上,我有一个Visual Studio Wep应用程序,我试图使用登录页面和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 [email protected];", 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) 

     } 

该应用程序在数据库中,目前持有一个测试项目连接的表,如所示这里:http://i.imgur.com/YFOQYKm.jpg

但是,当我输入“test”作为用户名和“password”作为密码时,它不接受登录。

我试图只包括我的代码的相关部分,使之成为任何人试图回答这个问题更加清晰,但这里是我的问题谈几点看法:

- 当我设置如果(空== lookupPassword )为“返回true”而不是“返回false”,应用程序允许登录。 这意味着lookupPassword在“lookupPassword =(string)cmd.ExecuteScalar();”之后仍然为空

- 如果将if(ValidateUser(txtUserName.Value,txtUserPass.Value))更改为if(userName = test和passWord = password),则应用程序正常工作。所以问题不在于登录到应用程序的实际行为,而仅仅是找不到SQL Server凭据为真。

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

- 当我提交登录凭证时,应用程序没有中断,它根本没有接受它们是正确的。

都会响起的是,这个问题是来自这几行字在我看来:

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

lookupPassword = (string)cmd.ExecuteScalar(); 

是否有人看到这个问题可能是我吗?我对编程非常陌生,请尽量保持答案尽可能简单。预先感谢您的任何帮助。 :)

+0

ExecuteScalar调用后'lookupPassword'的值是多少? – Richard 2014-09-04 12:50:29

+0

从您所说的话来看,您似乎在访问用户输入数据方面存在问题。什么类型的对象是txtUsername/txtPassword? – alexc95 2014-09-04 12:51:20

+4

PS。您似乎在存储明文密码,请考虑如果(由于其他漏洞)有人访问数据库会发生什么情况? (它已经做了很多次了,你*不*不同)。 – Richard 2014-09-04 12:51:41

回答

1

此表设计使用SQL Server中的几个reserved words。如果你不能修改这个架构,您可以按以下步骤更新您的查询:

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

话虽这么说,存储明文密码是一个可怕的安全做法。密码绝不应以加密或明文形式存储,应使用盐进行散列,以避免彩虹表破解密码。我会查看@Richard关于Rfc2898DeriveBytes的建议。您也可以搜索Google或Bing以使用salt和SHA256。

相关问题