Има ли добър пример за SimpleSAMLphp SLO?

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

Излизането обаче трябва да стане по два начина:

  • Ако потребителят натисне бутона за излизане на нашата платформа, трябва да го излезете от нашия сайт и да натиснете услугата SLO на IdP.

  • Ако потребителят натисне бутона за излизане от страна на клиента или от страна на друг доставчик на услуги, IdP на клиента ще натисне SLO услугата на нашия SP, която след това трябва да ги излезе от реалната ни платформа, преди да пренасочи потребителя обратно към отговора за излизане на SP страница.

Мога да убедя нашата платформа да пренасочи потребителя към произволна страница при излизане, така че мисля, че първата част може да бъде постигната от страница, която използва 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 сесиите на SPs, свързани с IdP, но... какво се случва със сесията на другите приложения? Те все още ще бъдат активни. Мислехте за активно повикване, за да го прекратите, но мисля, че е по-добре, ако замените и функцията "is_logged_in()", която много приложения прилагат.

Трябва да замените тази функция и да върнете true само ако съществува и валидна SP сесия, активна с помощта на функцията

$auth->isAuthenticated()

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

Проблем с IdP

Използвайте безплатна пробна версия на Onelogin, можете да регистрирате своя SP там и да използвате неговия IdP. Следвайте това ръководство за да конфигурирате вашите SAML конектори

Но мисля, че е по-добре да опитате да създадете IdP сами. Има хубава документация и стъпките са лесни. Използвайте "example-userpass" authsource, ако не искате да губите време за конфигуриране на база данни/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