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

Php 在mod_auth_sspi_1.0.4-2.2.2中禁用登录提示,php,windows,apache,authentication,sspi,Php,Windows,Apache,Authentication,Sspi,我想做的是: 在我们公司的内部网上创建一个主页,该主页自动获取查看该页面的人员登录的Windows用户名,而不会在页面加载时提示该人员输入这些凭据 目前,我只想让它获取本地用户名,因为我们的it人员需要一段时间才能获得域设置。例如,现在我想让它在没有任何提示的情况下捕获“(PC名称)\windows.user.Name” 环境: Windows 7 x64上的Apache 2.2.21(一旦投入生产,将在CentOS上) PHP 5.3.8(VC9-ZTS) Internet Explor

我想做的是:

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

  • 目前,我只想让它获取本地用户名,因为我们的it人员需要一段时间才能获得域设置。例如,现在我想让它在没有任何提示的情况下捕获“(PC名称)\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\u r($\u服务器)的PHP脚本

  • 为了简单起见,我正在测试的目录不是虚拟主机

到目前为止,我已经采取了以下步骤:

  • 从SourceForge下载mod_sspi_1.0.4-2.2.2,并将mod_auth_sspi.so提取到Apache模块目录

  • 添加了模块声明:

    LoadModule sspi\u auth\u module modules/mod\u auth\u 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选项,比如authoritive on/off等等。没有效果

  • 如果删除“requirevaliduser”,则不会再出现提示,但也不会传递用户名(它不是NULL;只是没有在数组周期中设置)

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

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

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

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

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

同样,我想要的是在没有任何提示的情况下加载页面,并在$\u服务器阵列输出中显示当前登录的Windows用户名

据我所知,这要么是Windows配置问题,要么是Apache配置问题,要么是浏览器配置问题。除此之外,我还没有什么想法

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


--克里斯

这可能是部分答案

BOOL WINAPI GetUserName(
  __out    LPTSTR lpBuffer,
  __inout  LPDWORD lpnSize
);

看起来您可以使用这个来获取系统信息,另一半可能是 使用PERL或Python自动获取信息,然后将其发布到PHP

下面是在Windows中获取系统信息的概要


老实说,如果您使用的是Linux,那么使用PECL/PAM做这件事非常容易。

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

在黑暗中随机拍摄,我尝试将其设置为“localhost”(测试服务器运行的域)。瞧!这就解决了!"http://localhost”另一方面,它导致了它的破裂

一旦我在Firefox中使用它,在验证服务器端配置正确后,将其应用于IE和Chrome是轻而易举的事。对于IE,我刚刚添加了“http://localhost“(在本例中,您确实需要协议前缀)添加到“Intranet”区域。由于Chrome使用的网络设置与IE相同,这一步使它在两种浏览器上都能正常工作

就服务器端配置而言,看起来我从一开始就拥有了它。不过,我可以将其简化一点,因此在目录块中真正需要的是:

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

require valid-user
使用此设置,如果您指向执行打印的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目录块中的SSPI内容中:

SSPIOmitDomain On
请注意,我只在Windows系统上测试过这一点,其中Apache Web服务器在localhost上运行。我还没有在Apache服务器在Linux上运行的情况下对其进行测试,尽管这不会对结果产生任何影响,因为服务器只是接受浏览器发送的任何内容。这还要求客户端运行Windows或其他与SSPI兼容的环境。我还没有决定如何让我们使用Mac的员工也能做到这一点

还要注意的是,我已经成功地在