如何通过反向代理启用Windows身份验证?

时间:2010-12-06 16:14:20

标签: iis authentication ntlm reverse-proxy

很抱歉,如果它是重复的,因为我不是安全人员或网络专家,我可能错过了正确的术语来查找信息。

我正在开发一个应用程序来拦截和修改Web浏览器和Web服务器之间的HTTP请求和响应(有关背景信息,请参阅how to intercept and modify HTTP responses on server side?)。我决定在ASP.Net中实现一个反向代理,它将客户端请求转发到后端HTTP服务器,将响应中的链接和头转换为正确的“代理”URL,并在提取相关信息后将响应发送给客户端从回应。

按预期工作,除了身份验证部分:默认情况下,Web服务器使用NTLM身份验证,只是通过反向代理转发请求和响应不允许用户进行身份验证远程应用程序。反向代理和Web应用程序都在同一台物理计算机上,并在同一个IIS服务器中执行(Windows server 2008 / IIS 7,如果这很重要)。我尝试在反向代理应用程序上启用和禁用身份验证,没有运气。

我已经查找了有关它的信息,它似乎与“双跳问题”有关,我不明白。我的问题是:有没有办法通过反向代理使用NTLM对远程应用程序上的用户进行身份验证?如果没有,我可以使用其他认证方法吗?

即使你没有我的问题的解决方案,只要指出我有关它的相关信息,以帮助我摆脱困惑将是伟大的!

4 个答案:

答案 0 :(得分:10)

  

我发现了问题所在(并且它是NTLM):为了让浏览器询问用户的凭据,响应必须具有401状态代码。我的反向代理将响应转发到浏览器,因此IIS正在添加标准HTML代码来解释无法访问所请求的页面,从而阻止浏览器询问凭据。   通过在状态代码为401时删除响应内容来解决问题。

对于几年前回答的人,我必须得到应有的尊重,我必须承认这显然是错误的。问题是确实在状态代码为401时删除响应内容后解决,但它与初始问题无关。 事实是,Windows身份验证是为了通过本地Windows网络验证人员,而本地Windows网络中没有代理服务器,甚至不需要代理服务器。 NTLM身份验证的主要问题是此协议不验证HTTP会话而是底层TCP连接,据我所知,无法从asp代码访问它。 我试过的每个代理服务器都破坏了NTLM身份验证 Windows身份验证对用户来说很舒服,因为他不需要为您的Intranet中的任何应用程序输入密码,这对于安全人员来说是可怕的,因为如果站点域受信任,则自动登录甚至没有提示IE,令网络管理员感到震惊,因为它将应用程序,传输和网络层融合到了一些“大脑的窗口”中,而不仅仅是普通的http流量。

答案 1 :(得分:6)

  如果TCP数据包没有像收到的反向代理那样完全转发,则NTLM不会工作>他们。这就是为什么许多反向代理不能与NTLM身份验证协同工作的原因。 (如nginx)>它们正确转发HTTP请求但不转发TCP数据包。

Nginx具有使用NTLM身份验证的功能。需要启用Keepalive,只能通过http_upstream_module使用。此外,在位置块中,您需要指定您将使用HTTP / 1.1以及"连接"应为每个代理请求清除头字段。 Nginx配置应该类似于:

upstream http_backend {
    server 1.1.1.1:80;

    keepalive 16;
}

server {
...

location / {
       proxy_pass http://http_backend/;
       proxy_http_version 1.1;
       proxy_set_header Connection "";
    ...
    }
 }

我在这个问题上拖了很长时间,但上面对我有用。请注意,如果您需要代理HTTPS流量,则认为有必要使用单独的上游块。为了澄清一点," keepalive 16;"指定允许代理保留上游的同时连接数。根据网站上预期的同时访问者数量调整数量。

答案 2 :(得分:4)

虽然这是一篇很老的帖子,但我只是想报告一下,对于我来说,使用Apache2.2反向代理和keepalive = on选项非常有效。显然,这会保持代理和SharePoint主机之间的连接打开并“固定”到客户端<>代理连接。我并不确切知道这背后的机制,但它运作得相当好。

但是:有时,我的用户会遇到他们以其他用户身份登录的问题。所以通过会话似乎有些混乱。我将不得不进行一些进一步的测试。

所有内容的解决方案(如果您拥有有效的签名SSL证书):将IIS切换到基本身份验证。这工作非常好,甚至Windows(即具有SharePoint连接的Office,所有基于WebClient的进程等)都不会抱怨。 但是当你只使用没有SSL / TLS的http,以及使用自签名证书时,它们就会出现。

答案 3 :(得分:3)

我确认它适用于apache2.2上的“keep-alive = on”

我用Wireshark检查了帧,我知道为什么它不起作用。如果TCP数据包没有像反向代理接收到的那样完全转发,则NTLM将不起作用。这就是为什么许多反向代理,如nginx,不能与NTLM身份验证一起使用。反向代理正确转发HTTP请求,但不转发TCP数据包。

NTLM需要TCP反向代理。