WSO2 IS Single Logout частично работает
Я тестирую SAML SSO, используя WSO2 Identity Server 5.0.0 с двумя экземплярами приложения PHP в качестве поставщиков услуг (используя onelogin phpsaml). Мне удалось заставить единый вход работать, но теперь я столкнулся с проблемой единого выхода.
- Когда я запускаю запрос на выход из PHPApp1, WSO2 IDP отвечает выходом из системы, и кажется, что он работает нормально;
- WSO2 IDP инициирует запрос на выход из системы для участников сеанса saml, в данном случае для PHPApp2;
- PHPApp2 обрабатывает запрос на выход из системы и перенаправляет его на URL-адрес выхода WSO2 IDP с помощью LogoutResponse;
- А теперь проблема: WSO2, похоже, не обрабатывает ответ на выход из PHPApp2 и печатает в журналах следующее сообщение:
WARN {org.wso2.carbon.identity.sso.saml.logout.LogoutRequestSender} - Неудачный однократный ответ на выход из http://php-app2.dev/saml/sls с кодом состояния перемещен временно {org.wso2.carbon.identity.sso.saml.logout.LogoutRequestSender}
После этого WSO2 продолжает пытаться отправлять запросы на выход в PHPApp2 и в результате выдает следующее сообщение:
ОШИБКА {org.wso2.carbon.identity.sso.saml.logout.LogoutRequestSender} - ошибка однократного выхода из системы после 5 повторных попыток с интервалом 60000 в миллисекундах. {} Org.wso2.carbon.identity.sso.saml.logout.LogoutRequestSender
Я попытался включить журналы отладки в WSO2, чтобы получить более подробную информацию о проблеме, но не смог получить какую-либо полезную информацию.
Есть ли способ получить более подробную информацию об этой проблеме?
Любая помощь приветствуется.
4 ответа
Майкл, В реализации SAML Single Logout, когда PHPApp1 инициирует выход из системы, он перенаправляет пользователя в WSO2 IDP. Затем WSO2 IDP проверяет сообщение LogoutRequest, после успешной проверки WSO2 IDP выясняет существующих участников сеанса (в этом случае WSO2 IDP обнаружит PHPApp2). Таким образом, после того, как участники сеанса выяснены, IDP WSO2 будет отправлять запросы на выход тем, кто не имеет состояния (без участия браузера), и участники сеанса (PHPApp2) должны проверять запросы на выход из IDP WSO2 и отправлять ответ на выход из системы (без браузера). участие, без перенаправлений) в WSO2 IDP. После того, как WSO2 IDP получит все ответы LogoutResponses обратно от всех участников сеанса, WSO2 IDP заключит контракт на ответ от пользователя инициатору PHPApp1, он будет отправлен как перенаправление браузера (отправка формы HTTP).
Проблема заключается в том, что реализация onelogin/php-saml обрабатывает запрос на выход из IDP путем перенаправления ответа на IDP.
Вместо этого я изменяю код, чтобы вернуть ответ, и теперь он работает. Учитывая, что я новичок в стандартах SAML, я не уверен, что это правильный способ решить эту проблему.
Убедитесь, что вы используете хранилище сеансов типа базы данных.
Затем SimpleSAMLphp может завершить сеанс без контекста браузера, когда он получает запрос LogoutRequest от удаленного сервера напрямую, а не через перенаправление браузера.
WSO2 IS работает с сильными предположениями, что серверы могут видеть и общаться друг с другом. Таким образом, он пытается быть вежливым и отправляет запросы на выход из системы на обратном канале (сервер-сервер без участия пользователя). В качестве ответа SP должен отправить обратно действительный ответ на выход из системы. В настоящее время WSO2 IS проверяет только код состояния HTTP (200).
SimpleSAMLphp работает с браузерами пользователей (и при условии, что запросы поступают от пользователя), и после получения запроса на выход из системы он пытается перенаправить пользователя обратно в IDP с ответом SAML с помощью привязки редиректа. Выдает ответ HTTP 302.
Попробуйте настроить SimpleSAMLphp для использования привязки POST для выхода из системы (в saml20-idp-remote.php). Тем не менее - SimpleSAMLphp может попытаться перенаправить пользователя перед возвратом формы с ответом на выход из системы, и WSO2 IS не будет выполнять перенаправления.
Габриель