在PHP web应用程序中使用多个身份提供程序进行单一登录


Single Sign On with multiple Identity Providers in PHP web app

我正在PHP中构建一个SAAS web应用程序,该应用程序需要集成SSO。我们将有多个客户端组织,每个组织都有自己的身份提供程序(Active Directory)。在研究可能性时,我遇到了SimpleSAMLphp,但我不确定它是否能满足我的需求,我希望得到关于最佳实现方法的反馈。看起来SAML或OAuth2是最好的选择,但我在这方面的经验有限。

需要这些能力:

  1. 客户端管理员应该能够通过AD添加和删除对我们应用程序的访问权限
  2. 使用各自的AD服务器对用户进行身份验证(与他人进行身份验证的灵活性是一大优势)-除了依赖静态IP之外,我如何知道要检查哪个身份提供程序
  3. 没有Identity Provider的组织的用户应该能够通过现有的身份验证方法登录(mysql中的hashed pass)
  4. 我们还将有一个混合移动应用程序(ios/android),在IONIC框架上开发,它需要有SSO,想知道我是否会通过REST API进行身份验证,或者该过程将如何工作。如果可能的话,希望找到一个既能适应网络应用程序又能适应移动应用程序的解决方案

其他信息:我计划将PHP应用程序托管在一台CentOS服务器上。如果需要,我们可以连接站点到站点的VPN。

  1. 据我所知,AD不能进行OAuth,只能通过ADFS进行SAML
  2. 您可以为每个客户端提供单独的SSO url。或者,您可以有一个SSO页面并确定要使用哪个IDP,然后您可以首先询问用户名,检查该用户属于哪个客户端,然后提取所有IDP并将其呈现给用户以选择一个,然后执行SSO,最后在cookie中重新记录IDP首选项,这样下次您就不必执行所有这些操作
  3. 当然,正常的un/pw登录页面
  4. 从未在移动设备上执行过SAML,但它主要是一个前端承载通道,我猜您必须打开一个web视图并在中执行SAML SSO过程。最后,您要么让您的站点执行整个SSO,并以某种方式将凭据"提供"给应用程序,要么从Web视图中获取响应并在应用程序中本地解码,但在这种情况下,由于断言消费者服务URL与您的站点不同,这将是一个具有自己EntityID的独立SP,这将引入额外的复杂性,您的系统以及设置ADFS的客户端。我猜第一个选项是让你的网站做所有SSO更好

我建议您看一下LightSAML,它是一组PHP库,用于实现SAML数据模型和Web浏览器SSO配置文件。如果您使用的是Symfony,它还提供了一个安全捆绑包,最重要的是它是一个适合自定义使用的库,而不是像简单的SAML这样的应用程序。

对于应用程序的设计、屏幕、流程和设置,你也可以查看zendesk是如何做到的。它们是多租户SAAS应用程序,有多个SSO选项,比如SAML、JWT,甚至我认为是OAuth。有机会融入他们,这很适合你正在做的事情。

如果你不局限于SAML,我建议JWT是最简单的,尽管不是一个标准。