2008-09-11 2 views
11

Этот вопрос связан с this one, хотя я думаю, что был слишком длинным, чтобы действительно получить хороший ответ. Я буду держать это вкратце.ASP.Net: Если у меня есть идентификатор сеанса, могу ли я получить объект Session?

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

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

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

ответ

3

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

+0

Отличный совет, но это все еще полагается на браузер, посылающего печенье ASP.NET_SessionId, который я не могу положиться. Мне нужен способ вручную передать SessionId через обработчик. – 2008-09-11 06:00:21

0

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

1

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

+1

Хорошая идея, но где хранить этот сингл-словарный словарь? Объект Application не будет распространяться на другие веб-серверы в ферме (или даже другие потоки процессов в веб-саду), база данных sql - это вариант, но я надеялся на что-то более элегантное. – 2008-09-11 06:03:23

+0

SQL-сервер был бы вашим лучшим выбором. Если вы уже используете государственный сервер для этого, это будет аналогичным штрафом. Или вы можете написать свой собственный WCF-сервис, который будет обрабатывать этот обмен. Он может работать как уникальный идентификатор-брокер, а также хранить идентификационные данные. Или даже использовать службу конечных точек SQL. – 2008-09-11 16:17:08

Смежные вопросы