IIS后面的HTTP服务器:传递身份验证标头

时间:2011-09-09 16:30:26

标签: iis authentication http-headers reverse-proxy basic-authentication

我有一个配置了Windows身份验证和URL重写的IIS实例,因此它基本上用作反向代理。我的后端服务器(在Linux上运行)需要一个REMOTE_USER标头。是否可以配置IIS以将有关经过身份验证的用户的信息传递给后端服务器?

2 个答案:

答案 0 :(得分:8)

如果为Windows Auth配置了IIS,则ARR将提出质询并仅在用户通过身份验证后转发请求。

可以使用重写规则中的HTTP命名约定和serverVariables元素转发带有请求的自定义标头。例如,在以下示例中,服务器变量LOCAL_ADDR将作为名为X-MY-HEADER的标头转发。

<rule name="Reverse Proxy to MySite" stopProcessing="true">
   <match url="^MySite/(.*)" />
   <serverVariables>
      <set name="HTTP_X_MY_HEADER" value="{LOCAL_ADDR}" />
    </serverVariables>
    <action type="Rewrite" url="http://www.myothersite.com/{R:1}" />
</rule>

不幸的是,无法使用此技术转发REMOTE_USER标头。这是因为当Authorization标头存在时,请求在认证模块运行之前被转发,因此未设置auth服务器变量(当映射到标题时,它们只是空白)。

但是,您可以将IIS设置为使用Basic Windows Auth,然后从Linux服务器上的Base64编码Authorization标头中提取用户名。

答案 1 :(得分:4)

我遇到了类似的问题,我想我会提到我是如何设法解决它的。我安装了Helicon ISAPI-Rewrite 3 Lite,这是一个ISAPI请求过滤器。由于它在管道中的身份验证阶段之后运行,因此它可以访问REMOTE_USER变量并可以重写请求,以便以REMOTE_USER作为其值添加新的HTTP标头。当然,只有当您对后端服务器有一定的控制权时才有用,这样您就可以使用此自定义标头的值而不是原始的REMOTE_USER变量。

ISAPI-Rewrite的全局配置文件(httpd.conf)中所需的代码段如下:

RewriteBase /
RewriteCond %{REQUEST_URI} ^/MySite.*
RewriteHeader X-Remote-User: .* %{REMOTE_USER}

RewriteCond部分将此规则限制为以/MySite开头的URI;随时根据需要调整它。