2016-08-26 4 views
0

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

  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

Я подозреваю, что это связано с тем, что один и тот же JSESSIONID-файл cookie делится между вкладками, поэтому, когда один из 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; }

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