Apache 和 mod_auth_sspi 的配置问题

Apache 和 mod_auth_sspi 的配置问题

我已经能够使用 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......

相关内容