Есть ли хороший пример SimpleSAMLphp SLO?

Один из наших клиентов просит, чтобы мы реализовали Single Logout (SLO) через SAML. Их стороной службы SAML является поставщик удостоверений, в то время как наш поставщик услуг. Single-Signon (SSO) работает, проверяя учетные данные пользователя с клиентом IdP, а затем перенаправляя пользователя на страницу входа на другой платформе с маркером, который позволяет им войти в систему. Эта платформа абсолютно ничего не знает о SAML и в в частности, не разделяет состояние сеанса SimpleSAMLphp.

Выход из системы должен произойти двумя способами:

  • Если пользователь нажимает кнопку выхода на нашей платформе, необходимо вывести их на нашем сайте и нажать на службу IdP SLO.

  • Если пользователь нажимает кнопку выхода на стороне клиента или на другой стороне поставщика услуг, клиент IdP попадает в нашу службу SP SLO, которая затем должна вывести их из нашей реальной платформы, прежде чем перенаправить пользователя вернуться к странице ответа на выход из системы.

Я могу убедить нашу платформу перенаправить пользователя на произвольную страницу при выходе из системы, поэтому я думаю, что первая часть может быть достигнута на странице, использующей SimpleSAML_Auth_Simple::getLogoutURL().

Такая страница может также работать при ударе со стороны IdP, но спецификации SAML достаточно сложны, и я не могу быть уверен, пока не попробуем. Однако конфигурация SP в config/authsources.php не принимает параметр SingleLogoutService; метаданные, созданные в /www/module.php/saml/sp/metadata.php/entityid, по-прежнему отображают /www/module.php/saml/sp/saml2-logout.php/entityid как местоположение SingleLogoutService. Если эта страница необходима для очистки сеанса SimpleSAMLphp, это хорошо, но мне нужно знать, как проскальзывать дополнительные перенаправления, необходимые для входа пользователя из нашей платформы.

Я попытался найти примеры, но все, что я получаю, это ссылки API. Было бы также неплохо узнать, как я могу проверить выход из системы, не пытаясь настроить собственный IdP; существует ли такая служба, как openidp.feide.no, которая обрабатывает SLO, а также SSO?

Ответ 1

Проблема SLO

Представьте эту схему:

Plattform - SP1 ----- IdP ----- SP2 ----- Приложение

Plattform и приложения связаны с simpleSAMLphp SP, который также формирует федерацию с IdP.

Вы должны найти обычную функцию выхода из Platffom, app1 и app2 и переписать ее:

normal_app_logout() {

 // code of the normal logout
 ....
 ....

 // new code

 require_once('<path-to-ssp>/simplesamlphp/lib/_autoload.php');   //load the _autoload.php
 $auth = new SimpleSAML_Auth_Simple('default-sp');  // or the auth source you using at your SP
 $auth->logout();   <--- call to the SLO 
}

Это закончится локальным сеансом, сеансом SP, подключенным к этому приложению, сеансом IdP и сеансами SP для SP, подключенных к IdP, но... что произойдет с сеансом других приложений? Они все равно будут активны. Вы подумали о активном вызове, чтобы закончить его, но я думаю, что лучше, если вы также переопределите функцию is_logged_in(), которую реализует множество приложений.

Вы должны переопределить эту функцию и вернуть только true, если существует также активный сеанс SP, используя функцию

$auth->isAuthenticated()

Недавно я реализовал эту функциональность в плагине Wordpess SAML, проверьте код

Проблема IdP

Используйте бесплатную пробную версию Onelogin, вы можете зарегистрировать свой SP там и использовать его IdP. Следуйте этому руководству для настройки ваших SAML-коннекторов

Но я думаю, что вам лучше попытаться построить IdP самостоятельно. Существует хорошая документация, и этапы легки. Используйте authsource "example-userpass", если вы не хотите тратить время на настройку базы данных /ldap.

Также вы можете установить фактический экземпляр simplesamlphp как SP и IdP, но я думаю, что если вы изучаете simplesamlphp, лучше не смешивать.