【发布时间】: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