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

Kri*_*aig 8 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

  • 添加了目录定义:

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

    AuthName "My Intranet"
    AuthType SSPI
    SSPIAuth On
    SSPIAuthoritative Off
    
    require valid-user
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

结果:

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

到目前为止的疑难

  • 我尝试过循环使用各种SSPI选项,例如authritative on/off和诸如此类的东西.没有效果.

  • 如果我删除"require valid-user",则不再出现提示,但是也没有传递用户名(它不是NULL;根本不在数组周期中设置).

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

  • 如果我输入的用户名无效,或者用户名正确但密码错误,则会加载该页面,但用户名将为"(PC-Name)\ Guest".

  • 如果我输入正确的用户名/密码,则显示用户名而不是Guest.

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

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

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

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

我将非常感谢您提供的任何帮助.谢谢!

--Kris

Kri*_*aig 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
Run Code Online (Sandbox Code Playgroud)

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

[REMOTE_USER] => dev-kdc-pc01\kris.craig
[AUTH_TYPE] => NTLM
[PHP_AUTH_USER] => dev-kdc-pc01\kris.craig
Run Code Online (Sandbox Code Playgroud)

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

SSPIOmitDomain On
Run Code Online (Sandbox Code Playgroud)

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

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

我希望这有帮助!谢谢!