Как я могу заставить Global Logout работать в мультитенантном приложении SAML, используя spring-security-saml?
Многопользовательское приложение SAML, над которым я работаю, использует spring-security-saml и содержит двух поставщиков услуг и одного IDP (службы федерации Active Directory). Разработчик, который включил SSO в это приложение, решил сделать его мультитенантным, потому что это приложение двойного назначения с двумя различными интерфейсами - по сути, два приложения в одном. Он предназначен для использования в браузере с двумя открытыми вкладками, поэтому один интерфейс запускается на первой вкладке, а другой - на второй вкладке. Кажется, все работает правильно, за исключением одного конкретного рабочего процесса:
- Откройте браузер, перейдите на страницу входа в ADFS и войдите в приложение с первым поставщиком услуг.
- Откройте другую вкладку, перейдите на страницу входа в ADFS и выберите второго поставщика услуг.
- Выполнить глобальный выход
Файл журнала содержит такие ошибки:
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;
}