2015-10-16 122 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