Как синхронизировать время жизни cookie проверки подлинности с помощью форм и сессии Asp.Net? - PullRequest
12 голосов
/ 20 мая 2009

Я создаю веб-сайт ASP.NET, который использует FormsAuthentication и стандартный механизм сеанса с конфигурацией, такой как:

<authentication mode="Forms">
    <forms cookieless="UseCookies" name=".MyAppAuth" loginUrl="~\Login.aspx" timeout="20"/>
</authentication>
...
<sessionState timeout="20" cookieless="UseCookies" />

Кажется, что время жизни файла cookie аутентификации не равно времени жизни пользовательского сеанса. Таким образом, ASP.NET не гарантирует, что

  1. Сессия завершается при выходе пользователя из системы,

  2. Сеанс не завершается до выхода пользователя из системы.

Есть ли способ настроить FormsAuthentication или \ и механизм состояния сеанса для достижения этих целей?

Ответы [ 3 ]

10 голосов
/ 20 мая 2009

Я слышал этот вопрос много раз, мой ответ, как правило, «зачем вам это?». Один не требует другого, и время его истечения должно определяться с использованием различных критериев.

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

С другой стороны, вы можете использовать аутентификацию и вообще не использовать состояние сеанса. Я обычно запускаю свои приложения с отключенным состоянием сеанса и состоянием просмотра и включаю их только в случае необходимости и постранично (или контролируем для представления состояния).

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

Аутентификация сохраняется как cookie на клиенте и в основном не использует ресурсы сервера. С точки зрения масштабируемости срок действия входа в систему обычно может быть больше срока действия сеанса. На самом деле пользователь может оставаться в системе на неопределенный срок. Когда срок действия аутентификации сохраняется короче, обычно это делается из соображений безопасности. Вы не хотите, чтобы учетная запись вашего банковского сайта была доступна кому-то еще, если вы уйдете с компьютера на 15 минут, верно? Вы можете войти в Gmail или Facebook и выбрать «запомнить меня» и вернуться через несколько дней, и вы будете все еще вошли в систему. Но, конечно, это будет новый сеанс, потому что ни одно веб-приложение не должно удерживать сеанс данные за несколько дней.

Теперь я видел, как много людей используют одинаковую продолжительность времени для аутентификации и истечения сеанса. И многие также Abandon () или Clear () их сеанс, когда пользователь выходит из системы. Но они забывают, однако, что вам все еще нужно управлять случаем, когда пользователь все еще вошел в систему, но сеанс истек (что создает новый пустой сеанс при следующем запросе), или когда пользователь аутентификация истекла, но не в их сеансе (требуя, чтобы они снова вошли в систему, но перенесла старый не истекший сеанс, возможно, с конфиденциальными данными другого пользователя) . Забота об этих случаях очень важна, независимо от того, какое время ожидания вы в конечном итоге выберете для своего приложения.

6 голосов
/ 20 мая 2009

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

Ничего не происходит на сервере, когда истекает срок действия файла cookie аутентификации. Нет отслеженного состояния.

У вас может быть ссылка 'logout' и в обработчике Abandon сеанс и SignOut из FormsAuthentication, но нет ничего, что вынуждает пользователя выйти из веб-сайта.

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

Избегайте использования Session, если можете, и, если необходимо, следуйте рекомендациям в статье MSDN Улучшение производительности ASP.NET . Также взгляните на Понимание режимов состояния сеанса + FAQ и, в частности, Q: Почему не запускается Session_End?

4 голосов
/ 21 мая 2009

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

Вы можете найти эту статью полезной. В нем обсуждаются несколько решений для обнаружения истекших сеансов и информирования пользователя об этом.

...