2015-10-16 3 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» поставляется пользователем, правильно?

Мое решение в С # с помощью Роджера следующим образом:

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 Problem] (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 хранятся в базе данных 'master', которая всегда существует в любом экземпляре SQL Server. Вы можете попытаться подключиться к нему вместо своей базы данных несуществующих данных, результат будет точно таким же. Ну, за исключением того, что в вашем случае вам нужно разрешение «control server», иначе столбец 'password_hash' в' sys.sql_logins' будет недоступен. –

+0

Еще раз спасибо. Я разместил свое решение (на C#) в соответствии с вашими предложениями в вопросе. Сначала я проверяю сначала, если существует логин, а затем попытайтесь подключиться, используя предоставленное имя пользователя и пароль, чтобы узнать, соответствуют ли учетные данные. – bergmeister

Смежные вопросы