Как ASP.NET (или любая веб-инфраструктура) реализует постоянное состояние сеанса? - PullRequest
1 голос
/ 07 января 2010

По разным причинам я сыт по горло состоянием сеанса ASP.NET, и я пытаюсь сделать это самостоятельно (вскоре появится отдельный вопрос, связанный с тем, почему я сыт по горло и возможно ли это сделать самостоятельно, но сейчас давайте предположим, что это так).

За исключением вопросов безопасности, похоже, что отслеживание сеансов включает в себя немного больше, чем сохранение cookie с guid и связывание этого guid с небольшой таблицей "session" в базе данных, которая имеет ключ к guid и содержит небольшое количество полей. для отслеживания времени ожидания и ссылки на первичный ключ в таблице пользователя для тех сеансов, которые связаны с зарегистрированными пользователями.

Но я застрял на детали с куки, в случае, если браузер пользователя не настроен на прием куки. Мне кажется, что каждый раз, когда пользователь получает доступ к любой странице, на которой включено состояние сеанса, ASP.NET должен определить, поддерживает ли браузер файлы cookie. Если cookie-файл сеанса уже отправлен вместе с запросом, очевидно, он знает, что cookie-файлы приняты.

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

(a) должен выполнять этот тест в оба конца для каждой страницы, которую посещает пользователь, или

(b) должен предположить, что браузер принимает файлы cookie и создать запись с (предварительным) идентификатором сеанса для пользователя на каждой странице - и, если предполагается, что состояние сеанса является постоянным, кажется, что он должен записать этот начальный идентификатор сессии в базе данных на каждой странице.

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

Я ошибаюсь, что меня озадачило?

(Для ясности, я не говорю о реализации пользовательского решения для хранения в подключаемой системе состояний сеансов ASP.NET. Я говорю о том, чтобы полностью пропустить систему состояний сеансов ASP.NET. вот этот: Реализация собственного управления сеансами в ASP.NET .)

Ответы [ 2 ]

1 голос
/ 07 января 2010

Поведение сеанса задается с помощью элемента sessionState в web.config. В элементе sessionState HttpCookieMode может быть установлено одно из UseUri, UseCookies, AutoDetect, UseDeviceProfile.

UseUri и UseCookies явно указывают ASP.NET, как обрабатывать сохранение идентификатора сеанса. Если используется UseDeviceProfile, то поведение определяется тем, поддерживает ли пользовательский агент файлы cookie (независимо от того, включены они или нет).

AutoDetect - интересный случай, который вас интересует. Как ASP.NET обрабатывает автоматическое обнаружение, объяснено в Понять, как работает функция ASP.NET Cookieless . В этой статье вы увидите, что у них есть 5 различных проверок, которые они делают. Как вы упомянули, одна из проверок - установить cookie-файл и выполнить перенаправление, чтобы проверить, существует ли cookie-файл. Если файл cookie существует, то браузер поддерживает файлы cookie, и файл cookie sessionID устанавливается. Однако это делается не при каждом запросе, поскольку еще одна проверка, которую они выполняют перед попыткой перенаправления, - это проверка на наличие каких-либо файлов cookie. Поскольку после первоначального набора cookie-файла и перенаправления cookie-файла sessionID будет установлено, наличие файла cookie позволяет ASP.NET знать, что cookie-файлы поддерживаются, и что дальнейший набор cookie-файлов и перенаправлений не требуется.

1 голос
/ 07 января 2010

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

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

Есть интересная статья о ASP.NET * 1006 без файлов cookie, которую вы должны прочитать.

EDIT:

@o.k.w: по умолчанию состояние сеанса поддерживается ASP.NET в процессе (читай: в памяти). Если в конфигурации не указано явно хранить сеанс в базе данных (SQL Server поддерживается "из коробки"), это не приведет к попаданию в базу данных. Устаревшие состояния сеанса удаляются из хранилища в процессе. К сожалению, с настройками ASP.NET по умолчанию каждый запрос без файлов cookie приводит к созданию нового сеанса.

Вот подробное сравнение доступных параметров хранения сеанса: http://msdn.microsoft.com/en-us/library/ms178586.aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...