Как реализовать действие через n-секунд (см. внутри)?

Задание гласит:

Если в течении 3 раз подряд был неверно введен логин/пароль то система должна быть заблокирована на следующие 15 секунд в первый раз, с увеличением времени блокировки на 20 секунд за каждый следующий неверный блок.


Проверка на количество неверных попыток реализована дебильно-костыльным методом
int WrongCounts = 0;
using (var db = new WorldYachtsEntities())
            {
                //Ищем пользователя в базе
                var user = db.Users.AsNoTracking().FirstOrDefault(u => u.Login == LoginBox.Text && u.Password == PasswordBox.Text);
                //Если нет
                if (user == null)
                {
                    
                    WrongCounts++;
                    if (WrongCounts == 3)
                    {

                        LoginWarnLabel.Text = "Заблокировано на 15 секунд";
                        LoginBtn.Enabled = false;
                        
                    }
                    LoginWarnLabel.Text = "Неверная пара логин/пароль\nНецдачных попыток: " + WrongCounts;
                    return;
                    
                }
                //Если есть
                switch (user.UserGroup) //Проверяем группу
                {
                    case "admin":
                        GenForms.AdminForm();
                        break;
                    case "customer":
                        GenForms.CustomerForm();
                        break;
                }
              

            }


Как это можно реализовать?
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
freeExec
@freeExec
Участник OpenStreetMap
Раз всё костыльно, то
Thread.Sleep(15000);
Но а вообще, запоминай время и при нажатии кнопки проверяй, прошло ли достаточно времени.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
Есть по сути ровно два подхода.
Первый - если вам надо чтобы программа сама разблокировалась - то нужен таймер. Обычно для всяких формочек существует компонент "таймер". Ну и привязываетесь там к времени и по истечению разблокируете форму.
Второй. Программа сама никак ничего не меняет в своем состоянии. Однако при попытке авторизации если время не истекло - то выводится сообщение о блокировке по времени. Тут все проще - вам нужна переменная когда можно в след. раз авторизовываться, и в авторизации сначала сравниваете ее с текущим времнем
Ответ написан
Комментировать
@Knuzya
"На грани закипания наш чайник дорогой..."
Начать надо с того, что Авторизацию рассматривать, как сервис с состоянием. И пробрасывать экземпляр сервиса в класс формы как зависимость. Таким образом Авторизацию станет возможно тестировать, что даёт гарантию, что описанное в требованиях реализовано как ожидается. В состояние же сервиса можно включить ВремяПоследнейНеудачнойПопыткиАвтортзации и КолвоНеудачныхАвторизаций, которые сбрасываются при успешной auth. Состояние можно хранить рядом с данными user/pass или в приложении in-memory. Сам код метода сервиса становиться проще. Хоть if + switch, хоть state machine это как фантазия подскажет, но уже без таймеров. Отказ же в авторизации реализовать через throw конкретного исключения, который ловишь на форме и разрисовываешь как душе угодно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы