【问题标题】:How do I set REMOTE_USER in a HTTP header?如何在 HTTP 标头中设置 REMOTE_USER?
【发布时间】:2015-10-27 12:59:10
【问题描述】:

我的 Apache 设置有问题。

我安装了一个部分接受外部身份验证的 Web 应用程序:

  • 我使用 Apache 来管理对我的应用程序网页的访问。
  • 如果认证成功,则使用用户名设置环境变量 REMOTE_USER。
  • 然后通过 HTTP 标头将用户名传递给我的应用程序,以便应用程序在用户会话中打开。
  • 这主要是应用程序的 Apache 配置。我只在我的应用程序配置文件中设置了包含用户名的变量(HTTP 标头)的名称。

问题是:我可以成功验证(大部分时间),但我的 HTTP 标头设置为 null。

一些额外的细节:

  • 我使用 Apache 和 mod_perl 模块(AuthenNIS + AuthzNIS + Net-NIS)通过 NIS 帐户对我的应用程序进行身份验证。
  • 使用以下 Apache 配置文件,当我尝试访问我的应用程序时,我有身份验证表单,但 REMOTE_USER 标头设置为 null。

        Listen 2208
        <VirtualHost *:2208>
    
                    RewriteEngine on
                    DocumentRoot "/path/to/static"
    
    
                    <Directory "/path/to/static">
    
                                Options +Indexes FollowSymLinks MultiViews
                                AllowOverride None
                                Order allow,deny
                                Allow from all
    
    
                                AuthType Basic
                                AuthName "Authentifiez vous"
                                PerlAuthenHandler Apache2::AuthenNIS
                                PerlAuthzHandler Apache2::AuthzNIS
                                PerlSetVar AllowAlternateAuth no
                                require valid-user
    
                    </Directory>
    
    
                    RewriteEngine on
                    RewriteRule . - [E=RU:%{LA-U:REMOTE_USER}]
                    RequestHeader set REMOTE_USER %{RU}e
    
                           RewriteRule ^/apps$ /apps/ [R]
                           RewriteRule ^/static/style/(.*) /path/to/static/june_2007_style/blue/$1 [L]
                           RewriteRule ^/static/scripts/(.*) /path/to/static/scripts/packed/$1 [L]
                           RewriteRule ^/static/(.*) /path/to/static/$1 [L]
                           RewriteRule ^/favicon.ico /path/to/static/favicon.ico [L]
                           RewriteRule ^/robots.txt /path/to/static/robots.txt [L]
                           RewriteRule ^(.*) http://localhost:2209$1 [P]
    
        </VirtualHost>
    

如果我设置 RequestHeader 设置 REMOTE_USER "username" 应用程序在相应的用户会话中打开。

要查看 REMOTE_USER 的值,我使用 Firebug Firefox 模块来显示 http 标头的值 + 我的应用程序有一个脚本来显示传递给它的变量的值。

我在 index.php 页面上测试了几乎相同的 Apache 配置,该页面显示了 http 请求中服务器变量的值。区别在于 RewriteRules。

        <?PHP
                    foreach($_SERVER as $key_name => $key_value) {
                    print $key_name . " = " . $key_value . "<br>";

                    }
        ?>

在这种情况下,我得到一个带有用户名值的 REMOTE_USER 和 HTTP_REMOTE_USER。

我不明白我的问题出在哪里。

阿帕奇 2.2.31 红帽 6.5

提前致谢!

【问题讨论】:

    标签: apache http authentication header


    【解决方案1】:

    请勿使用以下内容,因为如果 REMOTE_USER 设置为使用 mod_authn_ntlm 之类的模块(本地计算机的 ntlm,请参阅https://support.microsoft.com/en-us/kb/896861),您将在执行阶段遇到麻烦。

    RewriteCond %{LA-U:REMOTE_USER} (.+)
    RewriteRule . - [E=RU:%1]
    RequestHeader set X-Remote-User %{RU}e
    

    改用以下方法:

    RequestHeader set X-Remote-User expr=%{REMOTE_USER}
    

    mod_ssl 也有解决方案

    RequestHeader set X-Remote-User %{REMOTE_USER}s
    

    【讨论】:

    • 这是 Apache 2.4 的正确答案。旧样式(RewriteCond 等)仅适用于 2.2。
    • RequestHeader 在 2.4 上也适用于我! RewriteRule 破坏了 Web 服务之间的后续请求,我收到了递归错误!这是正确的答案。
    • 非ssl版本RequestHeader set X-Remote-User expr=%{REMOTE_USER}仅适用于Apache 2.4.10+。
    • 我发现here 提供的示例更正确:RequestHeader set X-Remote-User %{REMOTE_USER}e env=REMOTE_USER
    • 我很想给一个 -1 以将错误的方式放在第一个代码块的显着位置。尽管有其他文字警告,但完整的 stackoverflow 开发人员很容易陷入困境。当然,我们这些粗心的人可能应该得到它,但仍然......
    【解决方案2】:

    在 Apache 2.2 服务器中,我们给出了以下配置。我们有 C# ASP.NET Core 2.1 应用程序,在我们的 HTTP 请求标头中,我们得到如下用户名

       <LocationMatch ^/mylocation>
         AuthName "NTLM Authentication"
         NTLMAuth on
         NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp"
         NTLMBasicAuthoritative on
         NTLMBasicRealm xxx_yy
         AuthType NTLM
         require valid-user
         RewriteCond %{LA-U:REMOTE_USER} (.+)
         RewriteRule . - [E=RU:%1]
         RequestHeader set X-Remote-User %{RU}e
    
       </LocationMatch>
    

    在我们的 C# ASP.NET Core 2.1 应用程序中,我们在 HTTP 请求标头中得到以下信息

    Key: X-Remote-User, Value=xxx_yy\abcdefg
    

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 2011-06-24
      • 2014-05-16
      • 2020-04-17
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      相关资源
      最近更新 更多