php - 在 mod_auth_sspi_1.0.4-2.2.2 中禁用登录提示

标签 php windows apache authentication sspi

我正在尝试做的事情:

  • 在我们公司的 Intranet 上创建一个主页,该主页会自动获取查看该页面的人的登录 Windows 用户名,而不会在页面加载时提示该人输入这些凭据。

  • 目前,我只希望它获取本地用户名,因为我们的 IT 人员还需要一段时间才能完成域设置。例如,现在我希望它在没有任何提示的情况下捕获“(PC-Name)\windows.user.name”。

环境:

  • Windows 7 x64 上的 Apache 2.2.21(一旦投入生产,将在 CentOS 上运行)。

  • PHP 5.3.8 (VC9-ZTS)。

  • Internet Explorer 9.0.8x 和 Firefox 6.0.2(稍后会担心 Chrome)。

  • 当前测试页面只是一个调用 print_r( $_SERVER ) 的 PHP 脚本。

  • 为简单起见,我正在对其进行测试的目录不是 VirtualHost。

到目前为止我采取的步骤:

  • 从 SourceForge 下载 mod_sspi_1.0.4-2.2.2 并将 mod_auth_sspi.so 解压缩到 Apache 模块目录。

  • 添加模块声明:

    LoadModule sspi_auth_module modules/mod_auth_sspi.so

  • 添加了目录定义:

    允许覆盖无 选项无 订单允许、拒绝 允许所有

    AuthName "My Intranet"
    AuthType SSPI
    SSPIAuth On
    SSPIAuthoritative Off
    
    require valid-user
    

  • 通过转到 about:config 并将 network.automatic-ntlm-auth.trusted-uris 设置为 PHP 脚本的绝对 URL 路径,然后重新启动 Firefox,从而在 Firefox 中启用集成身份验证。

  • 我还没有在 IE 中完成相同的步骤,但一旦我让 Firefox 正常工作我就会这样做,因为这是我们内部支持的主要浏览器。

  • 重新启动 Apache 并尝试加载测试 PHP 脚本。

结果:

  • 在 IE 和 Firefox 中,在加载页面之前,系统会提示我输入用户名和密码。我不想要那个提示。我希望在没有提示的情况下自动检测用户名。

到目前为止的故障排除:

  • 我尝试循环使用各种 SSPI 选项,例如授权开/关等等。没有影响。

  • 如果我删除“require valid-user”,则不再出现提示,但用户名也未传递(它不是 NULL;只是未在数组句点中设置)。

  • 如果我在提示中点击“取消”,我会看到标准的“需要身份验证”页面。

  • 如果我输入了无效的用户名,或者输入了正确的用户名但密码错误,页面将加载,但用户名将是“(PC-Name)\Guest”。

  • 如果我输入了正确的用户名/密码,则会显示用户名而不是访客。

  • 我在 IE 或 Firefox 中输入用户名/密码后,浏览器会在后续页面加载时记住该用户名,直到我清除存储的密码缓存或重新启动浏览器。

  • 过去 3 个小时左右,我一直在谷歌搜索和随机猜测。零成功。我发现了一些独立的论坛帖子,有人在问这个问题,但他们要么没有得到回答,要么提供了我已经尝试过但没有成功的解决方案。

同样,我想要的是在没有任何提示的情况下加载页面,并在 $_SERVER 数组输出中显示当前登录的 Windows 用户名。

据我所知,这可能是:Windows 配置问题、Apache 配置问题或浏览器配置问题。除此之外,我完全没有想法。

如果您能提供任何帮助,我将不胜感激。谢谢!

--克里斯

最佳答案

花了几天时间,但我最终自己弄明白了。显然,描述 Firefox about:config 设置的各种文档和教程都是错误的。他们声称必须包括完整的 URI,包括协议(protocol)前缀。事实证明,事实恰恰相反。

作为在黑暗中随机拍摄的照片,我尝试将其设置为“本地主机”(测试服务器运行所在的域)。瞧!修好了!另一方面,“http://localhost”导致它崩溃。

一旦我让它在 Firefox 中运行,并验证了服务器端配置是正确的,将它应用到 IE 和 Chrome 中就轻而易举了。对于 IE,我只是将“http://localhost”(在这种情况下,您需要协议(protocol)前缀)添加到“Intranet”区域。由于 Chrome 使用与 IE 相同的网络设置,因此该步骤使其适用于两种浏览器。

就服务器端配置而言,看起来我从一开始就做对了。不过,我能够稍微简化它,所以目录 block 中您真正需要的是:

AuthName "Whatever you want to call your intranet"
AuthType SSPI
SSPIAuth On

require valid-user

使用此设置,如果您指向执行 print_r( $_SERVER ) 的 PHP 脚本,输出将包含如下内容:

[REMOTE_USER] => dev-kdc-pc01\kris.craig
[AUTH_TYPE] => NTLM
[PHP_AUTH_USER] => dev-kdc-pc01\kris.craig

如果你想摆脱域部分(即“dev-kdc-pc01\”),你可以在 PHP 中解析它或将此行添加到 httpd.conf 中目录 block 中的 SSPI 内容上面提到:

SSPIOmitDomain On

请注意,我只在 Apache 网络服务器在本地主机上运行的 Windows 系统上对此进行了测试。我还没有在 Apache 服务器在 Linux 上运行的情况下对其进行测试,尽管这不会对结果产生任何影响,因为服务器只是接受浏览器发送的任何内容。这还要求客户端运行 Windows 或其他一些 SSPI 兼容环境。我还没有确定如何为我们使用 Mac 的员工提供这项服务。

另请注意,我已在当前​​配置域的网络上成功测试了此功能。根据其他地方发表的文章,该行为在作为域成员的工作站上应该是相同的。

希望对您有所帮助!谢谢!

关于php - 在 mod_auth_sspi_1.0.4-2.2.2 中禁用登录提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8394148/

相关文章:

windows - 如何改变 explorer.exe 和 service.exe 的启动方式来编辑进程关联?

apache - 无法将 Sentry 与 Hive 绑定(bind)

Apache 不代理对 TomCat 的 HTTPS 请求,只显示本地 index.html

php - 如何判断您正在运行的 MongoDB 版本

windows - 如何使用 CMake 指定其中包含空格的路径?

php - 如何使用 mysql 和 php 内连接具有相同 id 的表?

javascript - 如何在 data-win-bind 中设置 ID?

php - htaccess : redirect an image path to a PHP script

php - 对 PROCEDURE 结果运行查询的最有效方法

php - Cookie 值更改为不同的值