【问题标题】:SSO in PHP application using AD credentials independent of Web ServerPHP 应用程序中的 SSO 使用独立于 Web 服务器的 AD 凭据
【发布时间】:2019-05-15 15:01:54
【问题描述】:

我有一个在 Linux 服务器上运行 Nginx 的 PHP 应用程序,它使用 LDAP 与我的 Active Directory 成功集成。

在当前场景中,用户可以为应用创建新登录名或使用他的 Windows 凭据登录应用。

现在,我正在尝试实施完整的单点登录 (SSO),并且使用其凭据登录到域中的 Windows 计算机的用户将能够打开登录的应用程序,而无需再次使用凭据。

对此进行一些研究,因为我的 Linux 服务器不在同一个域中,最好的选择是使用 NTLM(旧且不安全)、Kerberos protocol 或 Negotiate 协议(将为每个协议在 NTLM 和 Kerberos 中进行选择)请求),取决于 Windows 版本和域控制器中实现的内容。

互联网上有很多教程,还有一些关于 SO 主题的 good threads。这另一个 link 很好地概述了使用 Apache 作为 Web 服务器的选项(对于 Kerberos 选项,我找到了 Nginx port,所以这不是主要问题)。

好吧,我使用这些方法创建了一些测试应用程序(包括browser side 中的所有更改,仅限于 Firefox),但所有这些都依赖于 Web 服务器(Apache、Nginx 甚至 IIS)。由于我的应用程序已经通过 LDAP 与 AD 完全集成,我对一些独立于 Web 服务器的解决方案感兴趣。有没有办法“绕过”Web Server 中的身份验证,并直接在我的 PHP 代码(客户端 (Firefox) 到服务器 (PHP))上获取有关登录用户的信息?

我目前最好的猜测是 Kerberos 的某种“纯”PHP 实现,需要 PECL 模块或 NTLM,这是不安全的,并且仍然在第一个请求中要求用户凭据。

我知道这可能是不可能的,但我问的是我在这项研究中遗漏了一些重要信息的情况。是否可以直接在 PHP 中获取 windows 用户信息?

【问题讨论】:

  • 如果您想通过 SSO 获取“windows 用户”,那么 SPNEGO 协议是您的最佳选择。因此,您需要一些组件来验证通过 SPNEGO 发送到您的应用程序的 Kerberos 服务令牌。有趣的是,没有多少 PHP 扩展/模块可以实现这一点。
  • 我对这个主题做了很多研究,但没有找到任何完全独立于WebServer的PHP解决方案
  • 我不相信这在理论上是可能的,因为 php 将永远站在 Web 服务器的后面。也就是说,php 只会获取 Web 服务器将传递给它的信息。显然,您无法以任何方式从 php.ini 获取该信息(严格在客户端上找到)。浏览器配置是第一步,因为他需要传递数据,而Web服务器需要配置接受它。我基本上正在寻找与您目前所做的相同的事情,之前对 AD 的经验为零,所以这只是我从 3 小时的研究中收集的意见。
  • 另外,最适合您的解决方案可能是nginx.org/en/docs/http/ngx_http_auth_request_module.html

标签: php active-directory kerberos ntlm domaincontroller


【解决方案1】:

如果您不坚持使用 nginx,请使用带有 mod_auth_gssapi 的 Apache Web Server 2.4,这是由知道自己做什么的人编写的很棒的高质量代码。我多年来一直在为我的 PHP 东西做这件事。

【讨论】:

  • 我正在尝试寻找一些与 Web 服务器无关的解决方案(如果存在的话),但很高兴知道 Apache 有这个另一种选择。它看起来比 mod_auth_kerb 更容易实现。
  • mod_auth_kerb 已死,不要使用它。用 PHP 解决它意味着对 MIT Kerberos 进行 C 调用。那么,为什么还要麻烦使用该模块并感到高兴呢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多