我的 Nginx(Windows 7 上为 1.2.6)conf 文件中有以下设置:
location ~ ^/FOO/(.*)$ {
proxy_pass http://server_two:8888/FOO/$1;
}
我在server_two
IIS7 上运行使用基本身份验证的 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。我创建了一个能够提供类似功能的自定义模块
还有一篇关于此问题的博客文章hodo.dev。