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

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

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

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

  • Если пользователь нажмет кнопку выхода из системы на стороне клиента или на стороне другого поставщика услуг, IdP клиента вызовет службу 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?


person eswald    schedule 23.09.2011    source источник
comment
Взгляните на Shibboleth.   -  person Jared Farrish    schedule 05.11.2011
comment
@JaredFarrish: Программное обеспечение, похоже, основано на Java, и нас попросили использовать PHP для истерического изюма. Если вы имеете в виду протокол, его диктует клиент; они связаны, но я вовсе не уверен, что они полностью совместимы. Было достаточно трудно убедить истинный пакет SAML поговорить со службой клиента.   -  person eswald    schedule 06.11.2011


Ответы (2)


Проблема SLO

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

Платформа -- SP1 ----- IdP ----- SP2 ----- Приложение

Платформа и приложения связаны с 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, проверьте код

Проблема с поставщиком идентификационной информации

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

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

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

person smartin    schedule 05.11.2011

public function logout()
    {
        $timeNotOnOrAfter = new \DateTime();
        $timeNow = new \DateTime();

        $timeNotOnOrAfter->add(new DateInterval('PT' . 2 . 'M'));

        $context = new \LightSaml\Model\Context\SerializationContext();
        $request = new \LightSaml\Model\Protocol\LogoutRequest();
        $request
            ->setID(\LightSaml\Helper::generateID())
            ->setIssueInstant($timeNow)
            ->setDestination($this->_helper->getSloServiceUrl())
            ->setNotOnOrAfter($timeNotOnOrAfter)
            ->setIssuer(new \LightSaml\Model\Assertion\Issuer($this->_helper->getSpEntityId()));

        $certificate = \LightSaml\Credential\X509Certificate::fromFile($this->_helper->getSpCertFile());
        $privateKey = \LightSaml\Credential\KeyHelper::createPrivateKey($this->_helper->getSpPemFile(), '', true);

        $request->setSignature(new \LightSaml\Model\XmlDSig\SignatureWriter($certificate, $privateKey));

        $serializationContext = new \LightSaml\Model\Context\SerializationContext();

        $request->serialize($serializationContext->getDocument(), $serializationContext);

        $serializationContext->getDocument()->formatOutput = true;
        $xml = $serializationContext->getDocument()->saveXML();


        Mage::log($xml);

        $bindingFactory = new \LightSaml\Binding\BindingFactory();
        $redirectBinding = $bindingFactory->create(\LightSaml\SamlConstants::BINDING_SAML2_HTTP_REDIRECT);

        $messageContext = new \LightSaml\Context\Profile\MessageContext();
        $messageContext->setMessage($request);

        return $redirectBinding->send($messageContext);

    }

Наконец сделайте:

$httpResponse = $this->logout();
$this->_redirectUrl($httpResponse->getTargetUrl());
person Michael Leiss    schedule 15.01.2020