Могу ли я отказаться от сеанса InProc ASP.NET от сеанса, отличного от сеанса, выполняющего запрос? - PullRequest
2 голосов
/ 03 ноября 2008

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

Ожидается, что каждое приложение зарегистрирует ловушку выхода (URL) в CAS во время входа в это приложение. Когда CAS получает запрос на выход из одного из приложений, он вызывает ловушку выхода для всех приложений, совместно использующих билет SSO.

Мой вопрос таков: есть ли способ отказаться от сеанса InProc от другого сеанса? Я предполагаю, что поскольку HTTP-запрос будет исходить от сервера CAS, он получит свой собственный сеанс, но это сеанс пользователя, который я хочу завершить. У меня есть довольно хорошая идея, как сделать это с помощью отдельного сервера состояний сеанса, но я хотел бы знать, возможно ли это с использованием состояния сеанса InProc.

Ответы [ 4 ]

3 голосов
/ 19 мая 2009

Хаха, хорошо ... Похоже, ты можешь. Мне было интересно, есть ли способ сделать это, оказывается, есть.

Когда вы используете InProc, InProcSessionStateStore (внутренний класс) сохраняет состояние сеанса во внутреннем (непубличном) кэше. Вы можете получить доступ к этому кешу через отражение и удалить состояние сеанса вручную.

using System;
using System.Reflection;
using System.Web;

object obj = typeof(HttpRuntime).GetProperty("CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static)
        .GetValue(null, null);

if (obj != null)
{
    MethodInfo remove = obj.GetType()
        .GetMethod("Remove", BindingFlags.NonPublic | BindingFlags.Instance, 
            Type.DefaultBinder, new Type[] { typeof(string) }, null);

    object proc = remove.Invoke(obj, new object[] { "j" + state.SessionID });
}

Конечный результат заключается в том, что следующий запрос будет принимать тот же SessionID, но HttpSessionState будет пустым. Вы по-прежнему будете получать события Session_Start и Session_End.

2 голосов
/ 03 ноября 2008

После того, как я немного покопался и обдумал предоставленные ответы, я нашел альтернативу, которая позволяет мне продолжать использовать сессию InProc. По сути, он состоит из расширения модуля HttpModule, который уже обрабатывает единый вход для обнаруженных выходов CAS, и перенаправляет браузер на страницу выхода из приложения.

Структура:

Sign-On:

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

Вход-выход:

  1. Когда запрос на выход получен с сервера CAS, расшифруйте идентификатор и сохраните его в кэше всего приложения. Это должно быть закреплено в кеше, по крайней мере, достаточно долго для естественного истечения сеанса.
  2. Для каждого запроса ищите файл cookie единого входа и проверяйте его значение по кешированным идентификаторам сеансов. В случае попадания удалите файл cookie единого входа и перенаправьте браузер на URL-адрес выхода приложения.
  3. Для каждого выхода проверьте, есть ли cookie-файл SSO, и если это так, перенаправьте запрос на выход в CAS. В любом случае прекратите сеанс пользователя и выведите его из приложения.

Page_Load:

  1. Проверьте наличие файла cookie единого входа. Если его нет, перенаправьте на страницу выхода.
1 голос
/ 03 ноября 2008

С InProc SessionState вы не сможете получить доступ к данным ... С StateServer у вас все еще будет неприятный сценарий, пытающийся получить доступ к правильному API для удаления сеанса.

Скорее всего, вы захотите использовать решение с состоянием базы данных, например, предварительно упакованного поставщика состояний SqlServer, или стороннее решение, такое как DOTSS: http://codeplex.com/dotss

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

1 голос
/ 03 ноября 2008
...