Ограничение входа для каждого пользователя на один компьютер в ASP.NET - PullRequest
1 голос
/ 24 августа 2009

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

Если один и тот же пользователь уже вошел в систему, а другой человек пытается войти в систему с другого компьютера, тогда у меня должна быть опция

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

В настоящее время проверка подлинности выполняется с использованием проверки подлинности с помощью форм с настраиваемым членством и поставщиками ролей.

Наш сервер показывает его возраст, поэтому я ищу что-то, что использует наименьшую вычислительную мощность и, надеюсь, делает очень мало операций чтения из БД (если вообще необходимо). Моя первоначальная наивная реализация заключается в том, чтобы сохранить IP (в состоянии db «app?») При успешном входе в систему, а затем проверять каждый запрос страницы или каждый другой журнал при попытке в зависимости от сценария. Хотелось бы услышать о лучших идеях =)

Ответы [ 4 ]

4 голосов
/ 24 августа 2009

Вы можете сделать это так:

  • Сохраните текущий идентификатор сеанса (HttpContext.Current.Session.SessionID) в объекте Application вместе с отметкой времени.
  • При следующем запросе (например, в Global.asax) проверьте, совпадает ли текущий сеанс с предыдущим и прошло ли менее 20 минут. Если сеанс такой же, пусть работают нормально. Если они разные, пусть работают, только если прошло 20 минут. Обновите Application объект.

Это позволит одному пользователю одновременно, на одном компьютере одновременно. Вероятно, это не на 100% безопасно, но это очень жизнеспособный способ сделать это.

1 голос
/ 22 октября 2010

Привет Вот как я это реализовал (я добавил эти строки для загрузки базового класса моей страницы):

  bool authenticated = UserIsAuthenticated();

  if (Session["~~~loginprocessed"] == null)
  {
    if (authenticated)
    {
      // user just logged in:
      if (Application[Page.User.Identity.Name] != null)
        Application.Remove(Page.User.Identity.Name);
      Application.Add(Page.User.Identity.Name, Session.SessionID);

      Session.Add("~~~loginprocessed", true);
    }
  }
  else
  {
    if (!authenticated)
    {
      Session.Remove("~~~loginprocessed");
    }
  }

  if (authenticated)
  {
    if ((Application[Page.User.Identity.Name] == null) || (Application[Page.User.Identity.Name].ToString() != Session.SessionID))
    {
      System.Web.Security.FormsAuthentication.SignOut();

      // show some message to user which will tell he has signed out because of login from somewhere else!
    }
  }
1 голос
/ 24 августа 2009

Раньше у меня была похожая ситуация, и я следовал нижеприведенной оценке

  • Наряду с именем входа сохраняйте идентификатор сеанса и отметку времени в каждом запросе.
  • И позволяет пользователю получать доступ только в том случае, если комбинация логина и идентификатора сеанса одинакова.
  • Если комбинация отличается, вы можете либо

    • выйти из первого вошедшего в систему пользователя (по показывая им уведомление
      говоря другой пользователь вошел в ваш
      аккаунт) 0r
    • Выйти из недавно введенного пользователя, говоря уже это учетная запись используется

Вы можете использовать временную метку запроса для проверки тайм-аута сессии.

0 голосов
/ 24 августа 2009

Если я правильно понимаю ваш вопрос, вы хотите убедиться, что каждый пользователь может войти в систему только один раз в данное время. Насколько я знаю, поставщик членства ASP.NET хранит только дату последней активности и дату последнего входа в систему. Вы можете сохранить список идентификаторов пользователей, которые вошли в систему, и отобразить ваше сообщение, когда новый пользователь пытается войти в систему как пользователь, который уже находится в этом списке. Сложность может заключаться в том, что вам нужно удалить пользователя из этого списка «LoggedOn», когда он выйдет из системы. Возможно, вы можете использовать session_end в Global.asax

...