Вы действительно просите что-то, что находится за пределами сети. Протокол HTTP по определению не имеет состояния, что означает, что в любое время; серверу никогда не нужно знать, существует ли клиент. Более новые / более старые реализации языков программирования веб-сервера (например, php / asp.net mvc) по большей части уклоняются от сохранения какого-либо состояния о подключенных / активных клиентах.
Некоторые вопросы, которые следует задать себе, включают:
Как долго пользователь может быть «активным» на странице, не вызывая обратную передачу? Страницы, основанные на Javascript, могут позволить пользователю в течение некоторого времени интерактивно использовать страницу, прежде чем произойдет какой-либо постбэк.
Будут ли пользователи проходить через прокси или кеширующий сервер? В этом случае с одного и того же компьютера могут поступать несколько запросов от «разных» пользователей.
Будет ли ваше приложение работать только на одном компьютере или, возможно, на ферме серверов? Вам необходимо убедиться, что балансировка нагрузки (например) не загружает разных пользователей на разные серверы, обеспечивая несколько входов в систему.
Как насчет пользователя, который законно использует два разных браузера на одном компьютере? Это разрешено?
Можно предположить, что ваша проблема здесь связана с попытками использовать неправильную технологию, учитывая ваши требования? Может быть, написание клиентского приложения, которое использует прямое соединение с вашими серверами, будет более «безопасным»? (Да, я понимаю, что это огромные трудности, но если ваше требование одного пользователя / одного входа является абсолютным, возможно, вы могли бы исследовать этот путь?)
Хорошо, веб-решение
Для решения, ориентированного на http, вы можете попробовать таймер JavaScript, отправляющий запрос вашему серверу каждые X секунд, чтобы указать, что сеанс все еще активен. Пока браузер открыт и сетевое соединение корректно, вы должны получать эти «пинги». Сеанс поддерживается открытым файлом cookie, передаваемым httprequest.
Вы сможете закодировать страницу ping для сохранения сведений о пользователе либо в объекте приложения, либо в любом другом поставщике членства по вашему выбору, а затем опрашивать этого поставщика всякий раз, когда клиент пытается войти в систему.
Для этого потребуется относительно короткий тайм-аут в сеансе или какой-либо другой механизм, чтобы гарантировать, что сбойный браузер не заблокирует вашего законного пользователя слишком долго.
Обратите внимание: это ужасно не получится, если у пользователя не включен javascript (не думайте, что он будет включен!)