我有一种情况,我将simpleSamlPhp作为IDP,在某些情况下我想自己处理一个身份验证请求。在其他情况下,我想将请求转移到另一个IDP(取决于cookie的状态)。如果需要,该IDP可以直接与SP对话。
我可以编写自定义身份验证模块。我不确定的是在我不想自己处理的情况下将saml请求推送给第三方的最佳方法。
我看过一些有关IDP代理的帖子,这是我想要做的吗?
在最糟糕的情况下,我可以手动创建身份验证请求并将其发送给其他IDP,但感觉应该有更好的方法。
有没有比手动创建身份验证请求更好的方法?
答案 0 :(得分:1)
有几个选项,它实际上取决于您登录的SP的功能。如果它支持多个IdP,那么请使用发现,否则请使用代理。
如果服务提供商支持多个IDP或Discovery(用户选择正确的IdP),那么您可以这样配置SP。这是身份联合中的常见设置。
发现页面可以位于SP的外部(这是simplesamlphp
和shibboleth
中的一项功能,可能还有其他功能)。如果存在cookie,您可以自定义发现以自动选择正确的idp。发现协议允许您告诉SP哪个IdP启动登录。
代理你的IdP(IdP-A)是另一个IdP(IdP-B)的SP。在这种情况下,您在authsources
文件中创建一个SP并使您的Idp使用它。在这种情况下,IdP-A生成自己的SAML断言,而原始SP只知道IdP-A。这是一种常见的设置,其中SP只能知道单个IdP以及中心和辐射身份联合。
答案 1 :(得分:0)
帕特里克建议的代理是我想要的。它被称为“IdP代理”。
我对如何使用simplesamlphp实现这一点感到有些困惑,所以我发布了我的解决方案以供后代使用。
您需要像在Simple saml配置中一样定义第二个IdP。
您还需要像平常一样定义主机IDP,并按照here所述创建自定义身份验证源。但是,您不需要实施SimpleSAML_Auth_Source
而非sspmod_core_Auth_UserPassBase
的扩展名。
然后你应该在你的班级中加入以下代码
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。