我有一种情况,我作为身份提供商身份验证,在某些情况下,我想自己处理身份验证请求。在其他情况下,我希望将请求分派给另一个IDP (取决于cookie的状态)。如果需要,此IDP可以直接与SP对话。
我可以编写一个自定义身份验证模块。我不确定的是,在我不想自己处理的情况下,将saml请求推送到第三方的最佳方式。
我看过一些关于IDP代理的帖子,这是我想要做的吗?
在最坏的情况下,我可以手动创建身份验证请求并将其发送到另一个IDP,但感觉应该有更好的方法。
有比手动创建身份验证请求更好的方法吗?
发布于 2016-03-10 04:29:38
有几个选项,这实际上取决于您要登录的SP的功能。如果它支持多个IdP,那么就使用discovery,否则就使用代理。
发现
如果服务提供商支持多个IdP或发现(这是用户选择正确的IdP的地方),则只需以这种方式配置SP即可。这是身份联盟中的常见设置。
发现页面可以位于SP外部(这是simplesamlphp和shibboleth中的一项功能,也可能是其他功能)。如果存在cookie,您可以自定义发现以自动选择正确的idp。发现协议允许您告知SP使用哪个IdP启动登录。
代理
在代理中,您的IdP ( IdP -A)是另一个IdP (IdP-B)的SP。在本例中,您在authsources文件中创建了一个SP,并使您的Idp使用该SP。在这种情况下,IdP-A会生成自己的SAML断言,而原始SP只知道IdP-A。这是一种常见的设置,在这种设置中,SP只能知道单个IdP,并且在中心和星型身份联合中。
发布于 2016-03-11 20:53:41
正如Patrick建议的那样,代理是我想要的。它被称为“IdP代理”。
对于如何使用simplesamlphp实现这一点,我有点困惑,所以我将我的解决方案发布给后人。
您需要像在简单的saml配置中一样定义第二个IdP。
您还需要像往常一样定义主机IdP,并按照here的说明创建自定义身份验证源。但是,除了sspmod_core_Auth_UserPassBase之外,您不需要实现SimpleSAML_Auth_Source的扩展。
然后,您应该将以下代码放入类中
public function authenticate(&$state) {
// Custom logic here to choose IDP
$authId = 'proxy_test_idp'; // or whatever the id of IDP you need to proxy to is.
$as = SimpleSAML_Auth_Source::getById($authId);
$as->authenticate($state);
}simplesamlphp附带的multi auth module中的代码更详细地说明了这一点。根据您的需要,您可能需要执行更多操作,但这本质上是simplesamlphp中IDP代理的MVP。
https://stackoverflow.com/questions/35891933
复制相似问题