2009-04-08 5 views
7

Как ограничить количество пользователей веб-приложением.Ограничить количество пользователей, обращающихся к веб-приложению ASP.NET

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

Я видел несколько предложений, говорящих, что вы можете пометить учетную запись пользователя как «LoggedIn = True», когда пользователь вошел в систему. Затем каждая новая успешная попытка входа в систему проверяет количество записей «LoggedIn = True». Если он превышает лимит, пользователь отклоняется.

Как будет обрабатываться неожиданный ввод в этом случае? Что делать, если:

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

Все вышеперечисленное по-прежнему будет иметь флаг «LoggedIn = True» и вносить вклад в число зарегистрированных пользователей. Это может непреднамеренно блокировать аутентифицированных пользователей.

Я ищу больше для решений ASP.NET, если это возможно.

ответ

4

Предполагая, что ваша аутентификация пользователя как-то основана на сеансе, тогда ответ на все ваши «неожиданные» случаи (которые на самом деле будут нормой - люди редко могут выйти из веб-приложений) будут заключаться в том, что эти слоты пользователей становятся бесплатными, когда сеанс прерывается. Поэтому вам нужно исследовать шаблоны использования вашего приложения. Если вы заработаете много людей в течение нескольких минут, но не более того, тогда 30-минутный сеанс тайм-аута будет означать, что очень немногие люди действительно могут использовать приложение.

Основная проблема заключается в том, что веб-приложения по своей сути отключены, поэтому вы не можете контролировать то, что пользователь действительно делает между запросами на страницу. Обычно вы продаете лицензии для такого приложения для конкретных пользователей (поэтому, если компания покупает 20 лицензий, это даст им 20 имен пользователей и пароли). Тогда вы, безусловно, можете предотвратить несколько входов с помощью одного и того же имени пользователя и пароля, либо отказавшись от второго входа в систему, либо дезактивизируя предыдущий (что, вероятно, является лучшим подходом, если кто-то действительно переместился с одной машины на другую без выхода из системы на один из причины, которые вы очертите).

+0

На самом деле мы старались избегать зависимости от тайм-аутов, но, вероятно, нет другого решения. Спасибо за столь быстрый ответ. – 2009-04-08 07:19:56

1

Наиболее распространенное решение - иметь таймер активности. Вы можете предположить, что активный пользователь сделает хотя бы один запрос в течение «Х» времени - скажем, 5 минут или около того.

Вы можете применить это, поставив асинхронный запрос асинхронного асинхронного запроса с таймера, который запускается при загрузке страницы. Например, если вы предполагаете, что все активные пользователи сделают по крайней мере 1 запрос каждые минут, то каждая страница будет запрашивать пустую (но не кеш) страницу каждые минут. Таким образом, пока у них открыто окно браузера, вы всегда будете иметь активность от этого пользователя. Опять же, это обрабатывается асинхронными запросами, а не какой-либо директивой reload. Это делает его абсолютно прозрачным для пользователя.

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

+0

Tylerl: Не может ли это решение избежать реального таймаута сеанса? Я имею в виду, если пользователь держит свой браузер открытым, но ничего не делает в веб-приложении, он никогда не будет отключен, даже если он достигнет 30 минут. тайм-аут, правильно? – 2009-04-08 07:32:03

+0

Он может работать, как вы хотите. Через 30 минут после приседания, он ПОДДЕРЖИВАЕТ тайм-аут или нет? Вы можете закодировать его, чтобы это произошло в любом случае. Помните, вы можете поместить URL-адрес keep-alive вне нормального управления сеансом. Однако это не «новичок». – tylerl

+0

Да, он должен тайм-аут через 30 минут. Я понимаю, что для того, чтобы заставить это работать, я должен отправить запрос ajax за пределы моего веб-приложения? Или есть ли другой способ предотвратить этот запрос от сброса таймера сеанса? – 2009-04-08 08:12:10

0

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

Возможное решение - сохранить низкий тайм-аут сеанса (скажем, 1 или 2 минуты) и использовать функцию обратного вызова, чтобы поддерживать сеанс в режиме ожидания для пользователей бездействия. Затем вы можете увеличить счетчик в Session_Start и уменьшить его в Session_End и использовать его для отслеживания количества активных сеансов. Если количество активных сеансов выходит за пределы вашего предела, вы перенаправляете нового пользователя на страницу, которая отказывается от сеанса, и сообщает пользователю, что у вас слишком много посетителей на данный момент.

Смежные вопросы