8

我正在尝试做的事情:

  • 在我们公司的 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 模块/mod_auth_sspi.so

  • 添加目录定义:

    AllowOverride 无 选项 无 订单允许,拒绝 全部允许

    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 选项,例如权威开/关等等。没有效果。

  • 如果我删除“需要有效用户”,则不再出现提示,但是用户名也没有传递(它不是 NULL;只是没有在数组期间设置)。

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

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

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

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

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

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

据我所知,这可能是:Windows 配置问题、Apache 配置问题或浏览器配置问题。除此之外,我的想法很新鲜。

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

——克里斯

4

2 回答 2

7

花了几天时间,但我最终自己想通了。显然,描述 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

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

SSPIOmitDomain On

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

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

我希望这有帮助!谢谢!

于 2011-12-08T00:29:31.260 回答
0

这可能是部分答案。

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

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724432%28v=vs.85%29.aspx

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

这是在 Windows 中获取 SysInfo 的概要。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724426%28v=vs.85%29.aspx

老实说,如果您使用的是 Linux,这对 PECL/PAM 来说是一件非常容易的事情。

于 2011-12-07T22:57:15.900 回答