Начать надо с того, что Авторизацию рассматривать, как сервис с состоянием. И пробрасывать экземпляр сервиса в класс формы как зависимость. Таким образом Авторизацию станет возможно тестировать, что даёт гарантию, что описанное в требованиях реализовано как ожидается. В состояние же сервиса можно включить ВремяПоследнейНеудачнойПопыткиАвтортзации и КолвоНеудачныхАвторизаций, которые сбрасываются при успешной auth. Состояние можно хранить рядом с данными user/pass или в приложении in-memory. Сам код метода сервиса становиться проще. Хоть if + switch, хоть state machine это как фантазия подскажет, но уже без таймеров. Отказ же в авторизации реализовать через throw конкретного исключения, который ловишь на форме и разрисовываешь как душе угодно.