Методика входа в систему C# Win App

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 841
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Как насчет того, чтобы отслеживать входы пользователей, поддерживая сеанс для каждого входа в систему? Быстрое и грязное решение состоит в том, чтобы затем предложить им возможность входа в систему из «нового места» и аннулировать старую сессию. Затем, когда вы переходите к выполнению операции, сначала проверьте, действителен ли сеанс.

Лучшая реализация - поддерживать сеанс в рабочем состоянии и указывать тайм-аут. (т.е. если сеанс старше x минут, аннулируйте его.) Тогда вы не увидите «фантомных входов в систему» ​​из старых потерянных подключений - они автоматически истекают.

Я делаю приложение для Windows, а не веб-приложение.

Anoop 08.01.2009 11:21

@Anoop: сеанс не зависит от Интернета. Пользователь, входящий в Windows, также может называться сеансом.

GvS 08.01.2009 11:49

Не могли бы вы дать мне дополнительную идею или ссылку о сеансе? Я не очень разбираюсь в этом.

Anoop 08.01.2009 11:59

Здесь есть два общих ответа:

  • если вы попытаетесь войти в систему и уже вошли в систему, предложите прервать (сбросить) существующий логин
  • использовать опрос / тайм-аут - т.е. пусть приложение каждые 2 минуты (например) вызывает метод, который обновляет "последний полученный сигнал"; если вы не получили ответа в течение 5 минут (например), снимите флажок

Спасибо .... Я понял вашу идею. Но постоянная проверка замедлит работу моего приложения? База данных размещена в сети. Надеюсь, вы знаете об этом больше.

Anoop 08.01.2009 11:25

Это зависит от количества пользователей; 1 обращение на пользователя каждые 2 минуты и быстрая очистка (уборка) каждые несколько минут, часто бывает хорошо; если это не так, не используйте опрос - просто используйте первый вариант.

Marc Gravell 08.01.2009 12:00

Большое спасибо. Я буду следить за этим.

Anoop 08.01.2009 12:19

Зачем ограничивать количество раз, когда пользователь может входить в систему? В Windows обычно запускают несколько экземпляров приложения.

Я должен признать, что в моем приложении для Windows также есть часть, доступная только для одного пользователя. Чтобы узнать, подключены ли другие пользователи, я использую что-то вроде алгоритма опроса от Марка. С возможностью принудительного входа.

Обновление записи блокировки раз в минуту или две минуты не требует значительных ресурсов (если у вас не тысячи пользователей).

Спасибо ... Мне пришла в голову идея. У меня не так много пользователей, поэтому я могу использовать метод опроса.

Anoop 08.01.2009 12:25
Ответ принят как подходящий

Если вы намерены запретить совместное использование одного имени пользователя на разных компьютерах, после входа с действующим паролем зарегистрируйте уникальный токен на этом компьютере в 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

Это приложение не должно позволять пользователю входить в систему где-либо в сети, который уже вошел в систему, даже на той же машине. Итак, как я могу изменить код для облегчения требований.

Anoop 08.01.2009 13:17

В моем онлайн-банке, если я закрою веб-сайт, не выйдя из системы, мне не удастся снова войти в систему в течение 20 минут. После этого я снова могу войти в систему. Но если вы хотите упростить вход в систему, даже если пользователь не вышел из системы должным образом, просто создайте административный модуль для сброса статуса входа.

Michael Buen 09.01.2009 13:24

... затем позвольте пользователю связаться с администратором базы данных, чтобы изменить что-то

Michael Buen 09.01.2009 13:25

Другие вопросы по теме