Могу ли я отказаться от сеанса InProc ASP.NET из сеанса, отличного от сеанса, отправляющего запрос?

StackOverflow https://stackoverflow.com/questions/257843

Вопрос

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

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

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

Это было полезно?

Решение 2

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

Набросок:

Вход в систему:

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

Выход из системы:

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

Страница_загрузки:

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

Другие советы

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

Когда вы используете 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.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top