Как я могу заставить Global Logout работать в мультитенантном приложении SAML, используя spring-security-saml?

Многопользовательское приложение SAML, над которым я работаю, использует spring-security-saml и содержит двух поставщиков услуг и одного IDP (службы федерации Active Directory). Разработчик, который включил SSO в это приложение, решил сделать его мультитенантным, потому что это приложение двойного назначения с двумя различными интерфейсами - по сути, два приложения в одном. Он предназначен для использования в браузере с двумя открытыми вкладками, поэтому один интерфейс запускается на первой вкладке, а другой - на второй вкладке. Кажется, все работает правильно, за исключением одного конкретного рабочего процесса:

  1. Откройте браузер, перейдите на страницу входа в ADFS и войдите в приложение с первым поставщиком услуг.
  2. Откройте другую вкладку, перейдите на страницу входа в ADFS и выберите второго поставщика услуг.
  3. Выполнить глобальный выход

Файл журнала содержит такие ошибки:

Message a598hd6ff68479a44c3495f7h4216aa not found in session 11cfm6ja982te14dxxul71iufg Received logout response is invalid InResponseToField in LogoutResponse doesn't correspond to sent message a598hd6ff68479a44c3495f7h4216aa

Я подозреваю, что это связано с тем фактом, что один и тот же файл cookie JSESSIONID распределяется между вкладками, поэтому, когда один SP выходит из системы, он завершает связанный сеанс. Затем, когда другой SP пытается выйти из системы с тем же сеансом, он завершается неудачно, потому что сеанс пропал. Может кто-нибудь помочь мне решить эту проблему?

1 ответ

Решение

Наконец-то мне удалось заставить эту работу работать правильно, задав для invalidateHttpSession значение false в bean-компоненте SecurityContextLogoutHandler. Теперь, когда первый поставщик услуг выходит из системы, аутентификация все еще очищается, но сеанс остается живым. Затем, когда второй поставщик услуг выходит из системы, он находит сеанс и успешно выходит из системы. Это должно быть хорошо, так как Jetty по умолчанию отключит сеанс после 30 минут бездействия. Вот боб, который я изменил:

// Logout handler terminating local session @Bean public SecurityContextLogoutHandler logoutHandler() { SecurityContextLogoutHandler logoutHandler = new SecurityContextLogoutHandler(); logoutHandler.setInvalidateHttpSession(false); logoutHandler.setClearAuthentication(true); return logoutHandler; }

Другие вопросы по тегам