如何让 Nginx 将身份验证传递给 IIS 作为反向代理?

如何让 Nginx 将身份验证传递给 IIS 作为反向代理?

我的 Nginx(Windows 7 上为 1.2.6)conf 文件中有以下设置:

location ~ ^/FOO/(.*)$ {
    proxy_pass    http://server_two:8888/FOO/$1;
}

我在server_twoIIS7 上运行使用基本身份验证的 WCF 服务。当我访问时,http://server_two:8888/FOO/Service.svc?wsdl我获得了正确的端点。

当我访问时,http://myhost/FOO/Service.svc?wsdl会弹出一个用户/密码框。我可以输入我的凭证,直到天黑,但仍然没有任何结果。我还尝试了以下方法:

location ~ ^/FOO/(.*)$ {
    proxy_pass    http://server_two:8888/FOO/$1;
    proxy_set_header Host $host;
    proxy_set_header X-Accel-Expires 0;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

还有其他几种变体,但到目前为止,我还无法使登录过程正常运行。使用 Nginx 可以实现这一点吗?我遗漏了什么?

更新:

我忘了说了,IIS 设置为对 Windows 身份验证执行 HTTP 401 质询

答案1

默认情况下,NGINX 不会在上游连接上使用 keepalive,这可能会导致身份验证问题,因为 TCP 连接未得到维护。我会尝试打开 keepalive。请参阅 http://nginx.org/en/docs/http/ngx_http_upstream_module.html

答案2

根据 nginx 文档:

允许使用 NTLM 身份验证代理请求。一旦客户端发送带有以“Negotiate”或“NTLM”开头的“Authorization”标头字段值的请求,上游连接就会绑定到客户端连接。后续客户端请求将通过相同的上游连接进行代理,同时保留身份验证上下文。

“ntlm”选项仅适用于 Nginx Plus。我创建了一个能够提供类似功能的自定义模块

gabihodoroaga/nginx-ntlm 模块

还有一篇关于此问题的博客文章hodo.dev

相关内容