Ответственность за вашу форму лежит только на представлении пользовательского интерфейса. Должна ли ваша форма знать, как вы храните свои данные? Отвечает ли ваша форма, чтобы знать, когда пользователь должен изменить свой пароль? Нет.
Каждый класс должен нести одну ответственность. У вас может быть класс AuthenticationService
, отвечающий за аутентификацию пользователя, и класс UserRepository
для хранения / извлечения пользователей в базе данных. Например, это может быть ваш обработчик нажатия кнопки button2:
private void button2_Click(object sender, EventArgs e)
{
var authenticationService = new AuthenticationService(sqlcon);
try
{
var user = authenticationService.AuthenticateUser(txtusername.Text, txtpassword.Text);
if (user.Date.AddDays(90) < DateTime.UtcNow)
{
Changpassad obj2 = new Changpassad();
this.Hide();
obj2.Show();
return;
}
if (user.IsAdmin)
{
calladmin obj = new calladmin(user);
this.Hide();
obj.Show();
}
else
{
Callcenter1 obj = new Callcenter1(user);
this.Hide();
obj.Show();
}
}
catch (Exception)
{
MessageBox.Show("Invalid Login try checking Useraname Or Password !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Вы можете пойти дальше этого принципа, и ваши методы также будут нести единоличную ответственность. Например, в приведенном выше коде я по-прежнему извлекаю код, проверяющий необходимость изменения паролей и код, ответственный за открытие правильной формы.
Вы уже используете параметры в своем запросе SQL. Хорошо. Вы устойчивы к SQL-инъекциям .
Как только вы познакомитесь, я также рекомендую рассмотреть ORM, такие как Entity Framework , чтобы упростить процесс.
2. Не хранить незашифрованный пароль в базе данных
Серьезно. Никогда не делай этого.
Всегда старайтесь не управлять паролем пользователя. Если вам абсолютно необходимо, в .Net Framework есть встроенные классы для этого. Вот несколько ссылок, но быстрый поиск должен дать гораздо больше.
Если по каким-либо причинам вы не используете тезисы и решили самостоятельно управлять паролем. Вам нужно найти криптографически безопасный алгоритм хеширования ( не md5 , как в другом ответе). И вам нужно использовать уникальную «соль» для каждого хэша пароля. Я оставлю эту ссылку здесь, поскольку она выходит за рамки вашего текущего вопроса:
- Хэш-пароли в ASP.NET Core
- Разница между кодированием, шифрованием и хешированием
3. Дайте значимое имя вашей переменной.
Что такое button2
? Что такое obj2
? Что означает ds.Rows[0][0].ToString()
? Вы должны попытаться дать представительное имя вашей переменной. Как насчет btnLogin
, callAdminForm
, ...
Пока мы здесь, я рекомендую вам прочитать Общие правила именования C # . Например, соглашение о присвоении имен для классов - PascalCase. Это должно быть CallAdmin
, а не calladmin
.
4. Почему у вас есть имя пользователя / пароль, хранящиеся в нескольких таблицах?
Почему пользователи хранятся в tbladmin
и tblcallcenter
?
Как насчет одного tblUsers
и либо столбца, либо связанной таблицы, определяющей роль пользователя? Это будет легче поддерживать в долгосрочной перспективе. Зачем делать что-то дважды, если ты мог сделать это один раз?