2009-08-24 3 views
1

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

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

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

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

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

+1

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

+0

Как я уже сказал, наивная реализация =) – Fung

+0

Наивно или нет, никогда не используйте IP-адрес. –

ответ

0

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

+0

Как вы справляетесь с ненадежностью стрельбы session_end? – Fung

+0

Добавляя таймер-подобное решение для периодической очистки кеша. На второй взгляд использовать кеш ASP.NET для хранения списка userid – edosoft

4

Вы можете сделать это следующим образом:

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

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

1

Ранее я получил подобную ситуацию, и последовал по указанному ниже appraoch

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

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

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

+0

мой ответ выглядит так же, как и ответ skilwz ... :(.. его ответ показался, когда я начал печатать ... – RameshVel

1

Привет Это путь я реализовал это (я добавил эти строки в OnLoad базового класса моего Пейджа):

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! 
    } 
    } 
Смежные вопросы