Подтвердить что ты не робот

Как синхронизировать время жизни файлов 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 не гарантирует, что

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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