首页 文章

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

提问于
浏览
9

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

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

It is working as expected, except for the authentication part :Web服务器默认使用NTLM身份验证,只是通过反向代理转发请求和响应不允许用户在远程应用程序上进行身份验证 . 反向代理和Web应用程序都在同一台物理计算机上,并在同一个IIS服务器中执行(Windows server 2008 / IIS 7,如果这很重要) . 我尝试在反向代理应用程序上启用和禁用身份验证,没有运气 .

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

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

4 回答

  • 3

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

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

  • 4

    如果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;”指定允许代理保留上游的同时连接数 . 根据网站上预期的同时访问者数量调整数量 .

  • 6

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

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

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

  • 10

    我确认它在apache2.2上使用“keep-alive = on”

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

    NTLM需要TCP反向代理 .

相关问题