2014-09-04 81 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。

相關問題