在多租户应用程序中使用SimpleSAMLphp

时间:2015-05-20 14:11:16

标签: php single-sign-on saml multi-tenant simplesamlphp

我们的应用的租户拥有自己的子域名,例如customer1.domain.com,虽然它是一个代码库。一些租户希望SP使用SAML启动SSO。

实现这一目标的最佳方法是什么?

  1. 静态共享子域上的SimpleSAMLphp,例如sso.domain.com/saml /
  2. SimpleSAMLphp作为租户的一部分,例如customer1.domain.com/saml /
  3. 如果我们选择选项1,我们如何知道传入SAML请求的租户?

    如果我们选择选项2,您会如何建议为元数据/ authsources配置SimpleSAMLphp,因为它似乎只支持硬编码文件。

    由于

2 个答案:

答案 0 :(得分:0)

在我的一位前雇主中,我们有类似于选项2的设置,它对我们来说效果很好。唯一的区别是域名对每个客户端都是唯一的,他们将SAML发布到/index.php

客户1

client1.com/index.php

客户端2

client2.com/index.php

我们为每个客户端使用了一个侦听器来触发SAML有效负载的处理。

我们必须在authsources.php中为每个客户端配置密钥和源名称(源名称对于每个客户端是唯一的)。我们还为每个客户端使用了不同的密钥,您也可以为所有客户端使用一个密钥对,但安全性较低

我们还必须在每个客户端的saml20-idp-remote.php中配置指纹。

答案 1 :(得分:0)

我们最终选择了选项2并且运行良好。 SimpleSAMLphp以以下形式安装在多租户应用上:customer1.domain.com/saml /

在SimpleSAMLphp中,authsources.php的配置如下:

$_SERVER['HTTP_HOST'] => array(
    'saml:SP',
    'entityID' => 'https://'.$_SERVER['HTTP_HOST'],
    ...etc

这意味着每个租户都有一个独特的实体ID,其形式为我们的域名,例如: https://customer1.domain.com

执行SP发起的SSO时,我们会为此租户指定特定的IdP,否则他们会看到发现页面以及其他租户的所有IdP列表:

if (!$as->isAuthenticated()) {
    $params = array(
        'saml:idp' => $samlEntityID
    );
    $as->login($params);
}

到目前为止,它可以非常顺利地存储在数据库中的元数据。