Правильная 100% реализация IsOnline для членства в asp.net - PullRequest
0 голосов
/ 15 июля 2009

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

Теперь, используя поставщика членства asp.net, метод IsOnline возвращает логическое значение, которое отображает время ожидания в сравнении с датой последней активности. Для меня это не приемлемый вариант, потому что если пользователь просто закроет браузер после входа в систему, IsOnline все равно будет иметь значение true. Но его сеанс будет уничтожен (при условии, что он не использует «Помни меня»), поэтому, если он попытается войти в систему где-то еще, он скажет: «Извините, что вы все еще вошли в систему».

Есть ли сложные и быстрые варианты для этого ..?

Я думал о том, чтобы заставить пользователей «вспоминать», поэтому, когда он входит в логическое значение, «IsReallyOnline» будет иметь значение «истина», и наоборот, когда он выйдет из системы. Хотя эта опция имеет свои ограничения (люди отключают куки, не выходя из системы и не закрывая браузер, затем приходит sum1 еще и браузер на сайт, и он вошел в систему и т. д ....) это кажется наиболее жизнеспособным на данный момент?

Есть предложения?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 15 июля 2009

Вы действительно просите что-то, что находится за пределами сети. Протокол HTTP по определению не имеет состояния, что означает, что в любое время; серверу никогда не нужно знать, существует ли клиент. Более новые / более старые реализации языков программирования веб-сервера (например, php / asp.net mvc) по большей части уклоняются от сохранения какого-либо состояния о подключенных / активных клиентах.

Некоторые вопросы, которые следует задать себе, включают:

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

Будут ли пользователи проходить через прокси или кеширующий сервер? В этом случае с одного и того же компьютера могут поступать несколько запросов от «разных» пользователей.

Будет ли ваше приложение работать только на одном компьютере или, возможно, на ферме серверов? Вам необходимо убедиться, что балансировка нагрузки (например) не загружает разных пользователей на разные серверы, обеспечивая несколько входов в систему.

Как насчет пользователя, который законно использует два разных браузера на одном компьютере? Это разрешено?

Можно предположить, что ваша проблема здесь связана с попытками использовать неправильную технологию, учитывая ваши требования? Может быть, написание клиентского приложения, которое использует прямое соединение с вашими серверами, будет более «безопасным»? (Да, я понимаю, что это огромные трудности, но если ваше требование одного пользователя / одного входа является абсолютным, возможно, вы могли бы исследовать этот путь?)

Хорошо, веб-решение

Для решения, ориентированного на http, вы можете попробовать таймер JavaScript, отправляющий запрос вашему серверу каждые X секунд, чтобы указать, что сеанс все еще активен. Пока браузер открыт и сетевое соединение корректно, вы должны получать эти «пинги». Сеанс поддерживается открытым файлом cookie, передаваемым httprequest.

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

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

Обратите внимание: это ужасно не получится, если у пользователя не включен javascript (не думайте, что он будет включен!)

1 голос
/ 15 июля 2009

Быстрый вариант: сохранить IsOnline как сеанс. Проверьте, является ли сеанс верным, затем разрешите. Если нет, не позволяйте.

Если пользователь закроет браузер, он выйдет из системы в сеансе.

...