У меня есть конкретный запрос, чтобы разрешить только одному пользователю одновременно использовать приложение asp.net из-за природы веб-приложения.
Я пытался реализовать это с помощью состояния приложения, используя какой-то счетчик сеансовкоторый увеличивается на session_start и уменьшается на session_end, но проблема в том, что сессия начинается сразу, когда приложение отображает форму входа в систему (из-за аутентификации формы).
Если первый пользовательский браузер отображает login.aspx, session_start в global.asaxвызывается, и sessioncounter увеличивается на 1. SessionCounter теперь равен 1.
Если другой пользовательский браузер также отображает login.aspx, перед тем, как первый пользователь будет аутентифицирован, вызывается session_start в global.asax и sessioncounter увеличивается на 1.SessionCounter теперь равен 2.
Моя идея состояла в том, чтобы аутентифицировать пользователя, только если SessionCounter <= 1. Но в верхнем описанном случае у нас будет блокировка, так как sessionCounter уже равен 2, и если первый или второй пользователь пытается войти в систему, онне будуиметь возможность аутентификации, потому что sessioncounter больше 1. </p>
Вторая проблема - это когда тайм-аут сеанса до истечения времени аутентификации.Если время сеанса первого пользователя истекло, и в этот момент второй пользователь пытается войти, второй пользователь сможет успешно войти в приложение.Но что произойдет, если первые пользователи сделают некоторую обратную передачу, потому что время его аутентификации не истекло.Будет запущен новый сеанс, будет вызван обработчик события session_Start, счетчик сеансов увеличится, но пользователь все равно будет авторизован, потому что пользователь уже аутентифицирован.
Каков наилучший подход?Можно ли избежать состояния приложения, потому что ASP.net 3.5 имеет известную проблему вызова session_end сразу после session_Start, если объект сеанса не используется.
Я думал об использовании какого-либо флага базы данных, но тогда у меня возникнет другая проблема.Что произойдет, если пользователь закроет браузер перед сбросом этого флага.Я могу вставить некоторую метку времени при поднятии флага.Тогда у меня будет следующий сценарий:
Первый пользователь входит в систему. Поднимается флаг БД и вставляется метка времени.Первый пользователь забывает выйти из системы и закрывает только браузер.
Второй пользователь пытается войти. Флаг БД проверен, и, поскольку он уже поднят, он не может получить доступ к приложению.Если я установлю еще одно условие, чтобы проверить, прошел ли какой-то период времени с последней вставленной отметки времени, например, 30 минут, я мог бы разрешить второму пользователю доступ к приложению независимо от флага БД, но это не хорошее решение, потому что мне придетсяподождите этот период времени.
Как лучше всего решить эту проблему?Есть ли какая-либо глобальная переменная, доступная в .net framework, которая позволяет нам проверять общее количество онлайн-пользователей (я не использую членство провайдера)?