ПРИВЕТ, Я делаю решение ERP в приложении Windows C# (2.0) и базе данных SQL2005. Сетевое приложение обменивается данными через базу данных. Я использовал обычную технику для входа и выхода пользователя, сохраняя бит состояния. Моя проблема в том, что когда мое приложение прерывается по любой другой причине статус пользователя может не измениться. Из-за этого пользователь не сможет войти в систему в следующий раз. Как я могу решить эту проблему? Не могли бы вы дать какую-нибудь новую технику для манипуляций с пользователем?





Как насчет того, чтобы отслеживать входы пользователей, поддерживая сеанс для каждого входа в систему? Быстрое и грязное решение состоит в том, чтобы затем предложить им возможность входа в систему из «нового места» и аннулировать старую сессию. Затем, когда вы переходите к выполнению операции, сначала проверьте, действителен ли сеанс.
Лучшая реализация - поддерживать сеанс в рабочем состоянии и указывать тайм-аут. (т.е. если сеанс старше x минут, аннулируйте его.) Тогда вы не увидите «фантомных входов в систему» из старых потерянных подключений - они автоматически истекают.
@Anoop: сеанс не зависит от Интернета. Пользователь, входящий в Windows, также может называться сеансом.
Не могли бы вы дать мне дополнительную идею или ссылку о сеансе? Я не очень разбираюсь в этом.
Здесь есть два общих ответа:
Спасибо .... Я понял вашу идею. Но постоянная проверка замедлит работу моего приложения? База данных размещена в сети. Надеюсь, вы знаете об этом больше.
Это зависит от количества пользователей; 1 обращение на пользователя каждые 2 минуты и быстрая очистка (уборка) каждые несколько минут, часто бывает хорошо; если это не так, не используйте опрос - просто используйте первый вариант.
Большое спасибо. Я буду следить за этим.
Зачем ограничивать количество раз, когда пользователь может входить в систему? В Windows обычно запускают несколько экземпляров приложения.
Я должен признать, что в моем приложении для Windows также есть часть, доступная только для одного пользователя. Чтобы узнать, подключены ли другие пользователи, я использую что-то вроде алгоритма опроса от Марка. С возможностью принудительного входа.
Обновление записи блокировки раз в минуту или две минуты не требует значительных ресурсов (если у вас не тысячи пользователей).
Спасибо ... Мне пришла в голову идея. У меня не так много пользователей, поэтому я могу использовать метод опроса.
Если вы намерены запретить совместное использование одного имени пользователя на разных компьютерах, после входа с действующим паролем зарегистрируйте уникальный токен на этом компьютере в Staff.last_logged_at = @unique_token. При выходе из системы установите staff.last_logged_at = ''. Таким образом, даже если работа компьютера была прервана (сбой программы из-за вируса или случайное нажатие кнопки сброса компьютера и т. компьютер, на котором в данный момент находится пользователь, совпадает с last_logged_at. Если это то же самое, он / она все еще может войти в систему.
Если какой-то пользователь попытался войти в систему, используя имя пользователя другого пользователя, просто проверьте, совпадает ли токен компьютера одного пользователя с last_logged_at другого пользователя, если он не равен, запретить вход в систему, это означает, что два пользователя используют один и тот же пароль .
Теперь сценарий, если на компьютере происходит сбой очень трудно (расплавление процессора, сбой жесткого диска, требуется переустановка ОС и т. д.). Пользователю должно быть разрешено использовать другие компьютеры. Сделайте административный модуль, который может сброс настроек last_logged_at пользователя.
Для @unique_token просто используйте все, что есть уникальный и постоянный на компьютере, скажем, MAC-адрес, или хешируйте что-нибудь в настройках ОС.
псевдокод:
Logging In:
if (select count(*) from staff where staff_name = @staff_name and password = 'correct' and (last_logged_at = '' or last_logged_at = @unique_token) ) <> 0 then then
-- allow login
update staff set last_logged_at = @unique_token where staff_name = @staff_name
else if (select count(*) from staff where staff_name = @staff_name and password = 'correct' and last_logged_at <> @unique_token) <> 0 then then
-- disallow login
throw exception "You cannot use the same user name on two or more computers. Contact the administrator if you have any concerns"
else
-- disallow login
throw exception "Wrong password"
end if
Logging Out:
update staff set last_logged_at = '' where staff_name = @staff_name
Это приложение не должно позволять пользователю входить в систему где-либо в сети, который уже вошел в систему, даже на той же машине. Итак, как я могу изменить код для облегчения требований.
В моем онлайн-банке, если я закрою веб-сайт, не выйдя из системы, мне не удастся снова войти в систему в течение 20 минут. После этого я снова могу войти в систему. Но если вы хотите упростить вход в систему, даже если пользователь не вышел из системы должным образом, просто создайте административный модуль для сброса статуса входа.
... затем позвольте пользователю связаться с администратором базы данных, чтобы изменить что-то
Я делаю приложение для Windows, а не веб-приложение.