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

Я строю веб-сайт 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 или \ и механизм Session State для достижения этих целей?

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам