2015-10-16 97 views
0

我可以爲用戶創建一個SQL登錄賬號如下:檢查SQL登錄的憑證

CREATE LOGIN [myusername] WITH PASSWORD = N'mypassword', CHECK_POLICY= OFF; 

,我可以檢查如如果「名爲myUsername」存在:

SELECT * FROM sys.server_principals WHERE name = N'myusername' 

但我怎麼能檢查是否「名爲myusername」和密碼「wrong_password」由用戶提供的是正確的?

我在C#中的解決方案是與羅傑的幫助如下:

private static bool SqlLoginExists(string username) 
    { 
     SqlConnection connection = new SqlConnection(); 
     connection.ConnectionString = "Data Source=.;" + "Integrated Security=SSPI;"; 
     connection.Open(); 

     string sql_command = "SELECT count(*) FROM sys.server_principals WHERE name = N'" + username + "'"; 

     using (SqlCommand command = new SqlCommand(sql_command, connection)) 
     { 
      using (SqlDataReader reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        if (reader.GetValue(0).ToString() == "1") 
        { 
         return true; 
        } 
       } 
      } 
     } 
     return false; 
    } 

    public static bool CheckSQLCredentialsIfLoginExists(string username, string password) 
    { 
     bool SqlUserExists = SqlLoginExists(username); 

     if (SqlUserExists) 
     { 
      SqlConnection connection = new SqlConnection(); 
      connection.ConnectionString = "Data Source=.;" + "User id=" + username+";Password=" + password +";"; 
      try 
      { 
       connection.Open(); 
       return true; 
      } 
      catch (SqlException ex) 
      { 
       connection.Dispose(); 
       return false; 
      } 

     } 
     else 
     { 
      return true; // it is not a problem for me if account does not exist (as it will be created later), I am only worried about the case when the credentials are wrong 
     } 
    } 
+1

如果他們不是,用戶將無法登陸。你的意思是「我如何驗證未登錄的用戶」?因爲如果這是你的問題,你可能正在解決錯誤的問題 - 你想達到什麼目的?你是否需要代表用戶做些什麼,或許? –

+1

它看起來像[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。爲什麼你想要手動檢查它? SQL服務器相當不錯,它自己檢查身份驗證 - 所以你試圖達到什麼目的? –

+0

您的每個用戶是否都有SQL登錄名?這不一定是非常常見的用法。它往往是要麼映射域帳戶,要麼你有一個單一的SQL登錄,並且你使用單獨的用戶表通過你的應用程序代碼管理用戶登錄。 – Paddy

回答

0

可以使用pwdcompare()功能:

select pwdcompare(N'MyWrongPassword', sl.password_hash) as [Match] 
from master.sys.sql_logins sl 
where sl.name = N'MyLogin'; 

然而,你工作有非常大的機會錯誤的方向 - 嘗試使用提供的憑證建立連接更爲正確。

+0

謝謝。正是我在找什麼。我想這樣做的原因是因爲在數據庫存在之前,用戶在安裝對話框中提供了SQL憑據。因此,如果用戶在安裝過程中輸入了已經存在的帳戶但密碼錯誤,而不是拋出錯誤,則可以直接引發錯誤。 – bergmeister

+0

仍然沒有區別。 SQL Server登錄名和密碼存儲在任何給定的SQL Server實例中始終存在的'master'數據庫中。你可以嘗試連接它,而不是你現有的不存在的數據庫,結果將完全相同。那麼除了你的情況你需要'control server'權限 - 否則'sys.sql_logins'中的'password_hash'列將不可用。 –

+0

再次感謝。根據您在問題中的建議,我發佈了我的解決方案(使用C#)。我基本上首先檢查登錄是否存在,然後嘗試使用提供的用戶名和密碼進行連接,以確定憑證是否正常。 – bergmeister