Я бы настоятельно рекомендовал вам использовать параметры при работе с SQL, чтобы не быть уязвимыми для SQL-инъекций; специально для публичного веб-сервиса.
Из ваших запросов видно, что вы храните пароли в в текстовом формате . Опять же, я бы призвал вас подсолить и хеш пароли вашего пользователя для большей безопасности.
Вы можете выполнить то, что ищете, изменив свой запрос на 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.";
}