我们的一位客户要求我们通过 SAML 实现单一注销 (SLO)。他们的 SAML 服务端是身份提供者,而我们的是服务提供者。单点登录 (SSO) 的工作原理是使用客户端的 IdP 验证用户的凭证,然后将用户重定向到另一个平台上的登录页面,并使用允许他们直接登录的 token 。该平台对 SAML 完全一无所知,并且在特别是不共享 SimpleSAMLphp session 状态。
不过,注销需要通过两种方式进行:
如果用户点击我们平台上的注销按钮,需要让他们退出我们的网站,并点击 IdP 的 SLO 服务。
如果用户点击客户端或其他服务提供商的注销按钮,客户端 IdP 将点击我们 SP 的 SLO 服务,然后需要在重定向用户之前将他们从我们的真实平台注销返回 SP 的注销响应页面。
我能够说服我们的平台在注销时将用户重定向到任意页面,因此我认为第一部分可以通过使用 SimpleSAML_Auth_Simple::getLogoutURL()
的页面来实现。
当从 IdP 端访问时,这样的页面也可能工作,但 SAML 规范非常复杂,在我们尝试之前我无法确定。但是,config/authsources.php
中的 SP 配置不接受 SingleLogoutService
参数; /www/module.php/saml/sp/metadata.php/entityid
生成的元数据仍然列出 /www/module.php/saml/sp/saml2-logout.php/entityid
作为 SingleLogoutService 的位置。如果该页面是清除 SimpleSAMLphp session 所必需的,那很好,但我需要知道如何加入将用户从我们的平台注销所需的额外重定向。
我尝试搜索示例,但我得到的只是 API 引用。如果知道我如何在不尝试设置自己的 IdP 的情况下测试注销,那将是一件好事;是否有像 openidp.feide.no
这样处理 SLO 和 SSO 的服务?
最佳答案
SLO 问题
想象一下这个方案:
平台 -- SP1 ----- IdP ----- SP2 ----- 应用
Plattform 和 Apps 与 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
}
这将结束本地 session 、连接到此应用程序的 SP session 、IdP session 以及连接到 IdP 的 SP 的 SP session 但是...其他应用程序 session 会怎样?他们仍然会活跃。您考虑过主动调用来结束它,但我认为如果您还覆盖许多应用程序实现的“is_logged_in()”函数会更好。
您必须覆盖此函数,并且仅当存在使用该函数的有效 SP session 时才返回 true
$auth->isAuthenticated()
最近我在 Wordpess SAML plugin 上实现了这个功能, 检查 code
IdP 问题
使用Onelogin free trial ,您可以在那里注册您的 SP 并使用其 IdP。关注这个guide to configure your SAML connectors
但我认为您最好尝试自己构建一个 IdP。 有个不错的documentation而且步骤很简单。如果您不想浪费时间配置数据库/ldap,请使用“example-userpass”authsource。
您也可以将实际的 simplesamlphp 实例设置为 SP 和 IdP,但我认为如果您正在学习 simplesamlphp,最好不要混用。
关于php - 是否有一个好的 SimpleSAMLphp SLO 示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532490/