ASP.Net: Если у меня есть идентификатор сеанса, могу ли я получить объект Session?

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

Я работаю над веб-обработчиком (ashx), который принимает сообщение формы с страницы aspx. Когда обработчик получает сообщение этой формы, чтобы выполнить то, что ему нужно, он должен знать пользователя, который зарегистрировался (User.Identity.Name), но я не могу полагаться на файлы cookie, отправляемые браузером.

Я знаю, что могу получить Session.SessionID и поместить его в скрытое поле формы, но как только мой обработчик получит сообщение о форме, как я могу использовать этот SessionID для определения идентификатора пользователя в журнале?

Я использую режим StateServer для состояния сеанса.

Ответ 2

Я думаю, вы можете сделать это, реализуя интерфейс IReadOnlySessionState на вашем HttpHandler

Ответ 3

Если нет необходимости использовать сеанс напрямую, вы всегда можете сохранить любую информацию о зарегистрированном пользовательском идентификаторе в одноточечном словаре или кеше и ссылаться на него с помощью SessionID, хранящегося в скрытом поле. Я лично вижу проблемы безопасности в этом, но не буду вдаваться в них. Я бы рассмотрел вопрос о выдаче однопользовательских идентификаторов для этого типа реализации.

Ответ 4

В реализации HttpHandler или HttpModule вы не всегда можете получить доступ к сеансу из события BeginRequest. Есть еще одно событие, которое вы можете обработать, называемое OnAcquireRequestState. Если вы напишете свой код в этом случае, то HttpContext.Current.Session не будет пустым.