SimpleSamlPhp IDP呼叫另一个IDP(IDP代理)

时间:2016-03-09 12:43:01

标签: saml-2.0 simplesamlphp

我有一种情况,我将simpleSamlPhp作为IDP,在某些情况下我想自己处理一个身份验证请求。在其他情况下,我想将请求转移到另一个IDP(取决于cookie的状态)。如果需要,该IDP可以直接与SP对话。

我可以编写自定义身份验证模块。我不确定的是在我不想自己处理的情况下将saml请求推送给第三方的最佳方法。

我看过一些有关IDP代理的帖子,这是我想要做的吗?

在最糟糕的情况下,我可以手动创建身份验证请求并将其发送给其他IDP,但感觉应该有更好的方法。

有没有比手动创建身份验证请求更好的方法?

2 个答案:

答案 0 :(得分:1)

有几个选项,它实际上取决于您登录的SP的功能。如果它支持多个IdP,那么请使用发现,否则请使用代理。

发现

如果服务提供商支持多个IDP或Discovery(用户选择正确的IdP),那么您可以这样配置SP。这是身份联合中的常见设置。

发现页面可以位于SP的外部(这是simplesamlphpshibboleth中的一项功能,可能还有其他功能)。如果存在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。