Аутентификация пользователя в базе данных с использованием веб-службы .NET - PullRequest
0 голосов
/ 30 июля 2011

У меня есть база данных, созданная в SQL Server 2008 на моем компьютере.Он содержит таблицу с именем login, имеющую два столбца имени пользователя и пароля с определенными значениями.

Это мой код веб-службы , написанный в Visual Studio 2008. Мне нужно проверить, есть ли имя пользователя иПароль, который я предоставляю, правильный или нет, то есть, в основном, я хочу аутентифицировать пользователя через веб-сервис.

Так может кто-нибудь сказать мне, как мне это сделать?

1 Ответ

3 голосов
/ 30 июля 2011
  1. Я бы настоятельно рекомендовал вам использовать параметры при работе с SQL, чтобы не быть уязвимыми для SQL-инъекций; специально для публичного веб-сервиса.

  2. Из ваших запросов видно, что вы храните пароли в в текстовом формате . Опять же, я бы призвал вас подсолить и хеш пароли вашего пользователя для большей безопасности.

  3. Вы можете выполнить то, что ищете, изменив свой запрос на COUNT(*), выполнив его как скаляр и убедившись, что число больше, равно единице. Примерно так:

    myCommand.CommandText = "select COUNT(*) from Login where Username = @Username AND Password = @HashedPassword";
    int rowCount = (int)mycommand.ExecuteScalar();
    return rowCount == 1 ? "success" : "bad username or password";
    

SqlDataReader следует удалить из исходного кода.

EDIT : Так что же делает этот код?

Мы слегка изменили SQL-запрос. Я также изменил его, чтобы использовать параметры. Так что этот запрос говорит: Получите мне количество пользователей, которые имеют это имя пользователя и этот пароль в виде целого числа .

Таким образом, если один пользователь имеет это имя пользователя и пароль, он вернет 1. Если бы ни у кого не было этого имени пользователя и пароля, он вернул бы 0.

ExecuteScalar полезно, когда вы не ожидаете никаких строк назад; только одно значение. Это верно в нашем случае; все, что мы ожидаем, это число: количество пользователей.

Итак, когда вы соберете весь этот код вместе; это должно выглядеть примерно так:

try
{
    using(SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123"))
    {
        myConnection.Open();

        using (SqlCommand myCommand = new SqlCommand())
        {
            myCommand.Connection = myConnection;
            myCommand.CommandText = "SELECT COUNT(*) FROM Login WHERE UserName = @UserName AND Password = @Password";
            myCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName;
            myCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password;
            return (int) myCommand.ExecuteScalar() == 1 ? "success" : "bad username or password";
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
    return "an error occurred.";
}
...