Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# и базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Кузнецов Михаил
0 / 0 / 2
Регистрация: 15.05.2015
Сообщений: 72
#1

Присвоить значение в using(MySqlConnection){} - C#/MySQL

09.12.2016, 20:10. Просмотров 279. Ответов 7
Метки нет (Все метки)

Есть следующий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
        public bool Authorize(string login, string password)
        {
            credentials.Authorized = false;
 
            ConnectToSql();
            if (Connection.State == ConnectionState.Closed)
            {
                MessageBox.Show("Нет подключения к серверу.");
                return false;
            }
            if (login == null || password == null)
            {
                MessageBox.Show("Поле(-я) не заполнено(-ы)");
                return false;
            }
            password = Info.GetMd5Hash(Info.GetMd5Hash(password));
            try
            {
                using (Connection)
                {
                    MySqlDataReader reader = new MySqlCommand(string.Format("SELECT * FROM `l_users` WHERE `Login` = '{0}'", login),
                            Connection).ExecuteReader();
                    while (reader.Read())
                    {
                        if (reader.GetString("Password") == password)
                        {
                            string[] d = new[] { login, password, reader.GetString("Email"), reader.GetString("Nickname") };
                            credentials = new Credentials(d[0], d[1], d[2], d[3], true);
                        }
                        //MessageBox.Show(credentials.Authorized.ToString());
                    }
                    reader.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка авторизации");
                credentials.Authorized = false;
            }
 
            return credentials.Authorized;
        }
Беда в том, что возвращается не то значение, т.е. false в любом случае, хотя я присваиваю true. Не могу понять, где ошибка.
Подскажите пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2016, 20:10
Я подобрал для вас темы с готовыми решениями и ответами на вопрос MySQL Присвоить значение в using(MySqlConnection){} (C#):

MySqlConnection.state не изменяется по событию
Доброго дня. Есть такой очень примитивный кусок кода if (MyConnect.State !=...

MySqlConnection, несколько запросов одновременно
В общем написал вот такой класс для сервера, заметил что если не освободить...

Получить значение ячейки из таблицы и присвоить это значение в другую
Привет всем. Мне необходимо получить значение ячейки из таблицы и присвоить это...

MySqlConnection ssh-туннелирование
try { //string ConnetStr =...

Присвоить значение из Словаря переменной
Здравствуйте ! С этого место объясняется как работать In-memory storage ...

Присвоить переменной значение системной даты
Надо присвоить значение даты, которое есть на компе (права внизу), в...

7
OwenGlendower
Супер-модератор
Эксперт .NET
8762 / 7766 / 3323
Регистрация: 17.03.2014
Сообщений: 15,273
Записей в блоге: 1
09.12.2016, 20:56 #2
Кузнецов Михаил, запусти под отладчиком и посмотри почему так происходит. Может условие if (reader.GetString("Password") == password) не срабатывает из-за разного регистра букв.

Кликните здесь для просмотра всего текста
P.S. В целом следует отметить пару моментов:

1) Подставлять строки прямо в запрос - опасная практика дающая злоумышленнику возможность провести атаку с помощью внедрения sql. Вместо этого следует использовать параметры.

2) Хорошо что ты хранишь в базе MD5-хеш пароля, но этот алгоритм устарел и не подходит для хеширования паролей. Кроме того к каждому паролю следует добавлять случайную соль чтобы повысить степень защиты и чтобы одинаковые пароли у разных пользователей имели разный хеш. Вместо MD5 лучше использовать современные специализированные алгоритмы такие как PBKDF2, bcrypt, scrypt. Смотри пример с использованием PBKDF2 в теме http://www.cyberforum.ru/csharp-begi...ml#post9684363

3) Непонятно назначение цикла while (reader.Read()) - у тебя разве может быть несколько одинаковых логинов? - и назначение массива d.

4) Проверку логина, пароля на null логичнее поставить перед открытием соединения с БД чтобы не тратить зря время.
0
Кузнецов Михаил
0 / 0 / 2
Регистрация: 15.05.2015
Сообщений: 72
10.12.2016, 19:14  [ТС] #3
OwenGlendower, Однако, условие срабатывает, но переменная, почему-то присваиваться не желает и не собирается. Насчёт тех пунктов, которые были в сплойлере - спасибо, учту. Тем не менее, присвоить не получается.
0
OwenGlendower
Супер-модератор
Эксперт .NET
8762 / 7766 / 3323
Регистрация: 17.03.2014
Сообщений: 15,273
Записей в блоге: 1
10.12.2016, 19:17 #4
Кузнецов Михаил, может потому что ты перезаписываешь значение credentials, а другая функция использует старое значение?
0
Кузнецов Михаил
0 / 0 / 2
Регистрация: 15.05.2015
Сообщений: 72
10.12.2016, 19:18  [ТС] #5
OwenGlendower, Хм. Пока что эта структура используется только здесь.
0
OwenGlendower
Супер-модератор
Эксперт .NET
8762 / 7766 / 3323
Регистрация: 17.03.2014
Сообщений: 15,273
Записей в блоге: 1
10.12.2016, 19:21 #6
Кузнецов Михаил, покажи как вызывается Authorize и как делается проверка.
0
Кузнецов Михаил
0 / 0 / 2
Регистрация: 15.05.2015
Сообщений: 72
10.12.2016, 19:25  [ТС] #7
OwenGlendower:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        public void OpenChat()
        {
            if (credentials.Authorized == false)
            {
                RegLoginForm rgf = new RegLoginForm(this);
                switch (rgf.ShowDialog(this))
                {
                    default:
                    {
                        if (rgf.auth)
                        {
                            if (Authorize(rgf.login, rgf.pass))
                            {
                                if (chat != null) return;
                                chat = new ChatForm(credentials);
                                chat.Show();
                            }
                        }
                        else
                        {
                            if (Register(rgf.login, rgf.pass, rgf.confpass, rgf.email, rgf.nickname))
                            {
                                if (Authorize(rgf.login, rgf.pass))
                                {
                                    if (chat != null) return;
                                    chat = new ChatForm(credentials);
                                    chat.Show();
                                }
                            }
                        }
                    } break;
                }
            }
            else
            {
                if (chat != null) return;
                chat = new ChatForm(credentials);
                chat.Show();
            }
        }
Добавлю, что switch работает исправно, т.е. по нажатию кнопки в другой форме всё срабатывает, к этому притензий нет в принципе.
0
OwenGlendower
Супер-модератор
Эксперт .NET
8762 / 7766 / 3323
Регистрация: 17.03.2014
Сообщений: 15,273
Записей в блоге: 1
10.12.2016, 20:20 #8
Кузнецов Михаил, понятнее не стало. Раз ты говоришь что метод Authorize возвращает false хотя должен вернуть true, то проверь конструктор Credentials и пройдись пошагово по функции Authorize - может тогда стянет понятна причина.

Цитата Сообщение от Кузнецов Михаил Посмотреть сообщение
C#
1
2
3
4
5
switch (rgf.ShowDialog(this))
{
default:
...
}
Данная проверка не имеет смысла. Если писать так, то достаточно вызвать rgf.ShowDialog();. Если писать нормально, то двигаться дальше следует только в случае DialogResult.OK.
0
10.12.2016, 20:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2016, 20:20
Привет! Вот еще темы с решениями:

Как присвоить значение полю по имени? Класс статический
Здраствуйте! У меня есть статический класс Comm. Внутри него есть функция...

Присвоить значение одной формы Form1, форме Form2
Здравствуйте нужна помощь, вообщем есть две формы form1, form2. Form1 один...

Как присвоить значение для пареметров запросов SQLDATASOURCE?
Как присвоить значение для пареметров запросов SQLDATASOURCE update, insert,...

Данные SQL получить в comboBox и присвоить значение textBox
Здравствуйте! помогите написать код, уже много чего нашел, но написать так и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru