我们的一位客户要求我们通过SAML实施单点登出(SLO).他们SAML服务的一方是身份提供商,而我们的服务提供商.单点登录(SSO)通过使用客户端的IdP验证用户的凭证,然后将用户重定向到另一个平台上的登录页面,使用令牌让他们直接登录.该平台完全不了解SAML,并且特别是不共享SimpleSAMLphp会话状态.
注销需要通过两种方式实现:
如果用户点击我们平台上的注销按钮,则需要将它们从我们的站点注销,然后点击IdP的SLO服务.
如果用户点击客户端或其他服务提供商那边的注销按钮,客户端IdP将点击我们的SP的SLO服务,然后需要将它们从我们的真实平台登录,然后再将用户重定向回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/entityidSingleLogoutService位置.如果该页面是清除SimpleSAMLphp会话所必需的,那很好,但我需要知道如何处理将用户登出我们平台所需的额外重定向.
我试过搜索示例,但我得到的只是API参考.知道如何在不尝试设置我自己的IdP的情况下测试注销也很好; 是否有openidp.feide.no处理SLO和SSO的服务?
想象一下这个方案:
平台 -- SP1 ----- IdP ----- SP2----- 应用程序
Plattform 和应用程序通过 simpleSAMLphp SP 连接,该 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
}
Run Code Online (Sandbox Code Playgroud)
这将结束本地会话、连接到该应用程序的 SP 会话、IdP 会话以及连接到 IdP 的 SP 的 SP 会话,但是...其他应用程序会话会发生什么情况?他们仍然会很活跃。您考虑过主动调用来结束它,但我认为如果您还覆盖许多应用程序实现的“is_logged_in()”函数会更好。
您必须重写此函数,并且仅当存在使用该函数的有效 SP 会话处于活动状态时才返回 true
$auth->isAuthenticated()
Run Code Online (Sandbox Code Playgroud)
最近我在Wordpess SAML插件上实现了这个功能,检查代码
使用Onelogin 免费试用版,您可以在那里注册您的 SP 并使用其 IdP。按照本指南配置您的 SAML 连接器
但我认为你最好尝试自己构建一个 IdP。有一个很好的文档,并且步骤很简单。如果您不想浪费时间配置数据库/LDAP,请使用“example-userpass”authsource。
您也可以将实际的 simplesamlphp 实例设置为 SP 和 IdP,但我认为如果您正在学习 simplesamlphp 最好不要混合。
| 归档时间: |
|
| 查看次数: |
9476 次 |
| 最近记录: |