我已经能够使用 XAMP 与 Apache 2.0.55 和 XAMP Apache 2.2.14 使其工作,没有任何问题。
但是,当我尝试配置我们的内部网服务器(Apache 2.0.59)时,我没有得到相同的结果。
结果是以下变量包含所需的信息:$_SERVER["REMOTE_USER"] 和 $_SERVER["PHP_AUTH_USER"]。在本例中,它们是空白的。我期望的是“domain/user_name”。
Conf 文件内容:
<Directory "/xxx/xampp/htdocs/">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
#Options Indexes FollowSymLinks Includes ExecCGI
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
#AllowOverride All
AllowOverride None
#
# Controls who can get stuff from this server.
#
#Order allow,deny
#Allow from all
Order allow,deny
Allow from all
#NT Domain Login
AuthName "Intranet"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
SSPIDomain "xxxx"
SSPIOfferBasic Off
SSPIPerRequestAuth On
SSPIOmitDomain Off # keep domain name in userid string
SSPIUsernameCase lower
Require valid-user
</Directory>
我想指出的是,我已经修改了路径以反映内联网环境。
我正在使用以下模块: http://sourceforge.net/projects/mod-auth-sspi/
一旦安装了模块并修改了 conf 文件,内联网环境的服务器范围就不会填充预期的变量。
编辑#1
<Directory "/path_here">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
#Options Indexes FollowSymLinks Includes ExecCGI
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
#AllowOverride All
AllowOverride None
#
# Controls who can get stuff from this server.
#
#Order allow,deny
#Allow from all
Order allow,deny
Allow from all
#NT Domain Login
AuthName "Intranet"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
SSPIDomain "domain_here"
SSPIOfferBasic On
SSPIPerRequestAuth On
SSPIOmitDomain Off # keep domain name in userid string
SSPIUsernameCase lower
Require valid-user
</Directory>
答案1
我曾经遇到过这些问题并且偶然发现过它们......
猜测一下,您的内联网使用的是代理吗?
这是我的 SSPI 配置,我看到的唯一区别是我使用 LocationMatch 而不是 Directory
<LocationMatch ^/$>
AuthType SSPI
AuthName "TECHNO"
SSPIAuth On
SSPIAuthoritative On
SSPIOfferBasic On
Require valid-user
</LocationMatch>
为了使 SSPI 与 PHP 配合使用,我必须使用 LDAP (php ext)。如果没有更多信息,我无法进一步帮助您。
菲尔
答案2
我猜测发生的情况是,您正在使用 FQDN 或 IP 来访问内联网服务器,而使用“localhost”之类的东西来访问您的开发环境。
这里的问题是,您的 Web 浏览器看到 FQDN 并假设您正在访问外部网站;虽然我们知道这是不正确的,但出于安全原因,我们这样假设。因此,浏览器将提示用户登录。然而,这不会发生在您身上,因为您已将“SSPIOfferBasic”设置为关闭。
解决的第一步是启用 SSPIOfferBasic,以便我们可以进行测试,确保 NTLM 身份验证可以在给定用户名和密码的情况下正常工作。
如果上一步启用了弹出窗口,要求您输入用户名和密码,然后填写该信息,然后将您的信息传递给 PHP 脚本,那么我们就知道这是浏览器没有自动传递 NTLM 信息的问题。如果没有,那么您还有另一个问题,下一步可能会解决,也可能不会解决。
要告诉浏览器此站点是 Intranet 站点并且可以发送身份验证信息,我们需要将其添加到 Internet 属性 -> 安全 -> 本地 Intranet -> 站点 -> 高级 -> 网站列表中。Google 是您访问此窗口的好帮手,因为每个浏览器的设置都不同;但是,它是 Windows 的中心构造,因此它将适用于所有利用其设置的浏览器。在较大的公司中,可以通过组策略轻松将其推送到所有计算机。
** 注意事项 ** 在更改 Internet 策略面板 (IE) 之间,某些浏览器必须重新启动,而其他浏览器则无需重新启动 (Chrome);最好的办法是始终重新启动浏览器,以防万一。
有时通过弹出身份验证的 NTLM 身份验证会失败,或者由于某些未知原因会要求您多次进行身份验证,然后抛出错误。我不知道这个问题的根源,但我发现每次询问时输入用户名/密码,然后只需刷新即可生成一个工作页面。这仅适用于将站点添加到本地 Intranet 区域之前的测试。
答案3
尝试使用 mod_rewrite 添加提供的用户名(带有或不带有)域名,如下所示:
# add username
RewriteEngine on
RewriteCond %{IS_SUBREQ} ^false$
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER}]
RequestHeader set Remote-User %{PROXY_USER}e
检查发送到 PHP 的标题 - 我不知道 PHP 中的函数,但会有某种“转储所有标题”可调用函数(或可调用函数的组合)向您显示它们。
可能是因为用户名没有传递给 PHP,或者标头键名称与 PHP 所期望的不同(REMOTE_USER 或 PHP_AUTH_USER);您可以修改 PHP 以适应或使用 mod_rewrite。
有些人会建议避免使用 mod_rewrite......