有一个很好的SimpleSAMLphp SLO示例吗?

esw*_*ald 10 php saml logout

我们的一位客户要求我们通过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的服务?

sma*_*tin 2

SLO问题

想象一下这个方案:

平台 -- 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 最好不要混合。