【发布时间】:2017-09-27 12:51:21
【问题描述】:
我正在使用此代码连接到第三方服务器。
using (HttpClientHandler httpClientHandler = new HttpClientHandler())
{
httpClientHandler.AllowAutoRedirect = false;
httpClientHandler.Credentials = new NetworkCredential(login, password);
using (HttpClient authClient = new HttpClient(httpClientHandler))
{
response = await authClient.GetAsync(authenticationUrl).ConfigureAwait(false);
... response processing here
}
}
第三方服务器是一个设备,他们最近启用了 NTLM。从开启 NTLM 开始,我的请求现在收到如下 HTTP 500 错误错误:
类型异常报告消息 NTLM 指定。降级为基本 身份验证(和/或 SSL),但不支持降级。描述 服务器 遇到一个内部错误,阻止它完成这个 要求。异常 java.lang.UnsupportedOperationException: NTLM 指定的。降级到基本身份验证(和/或 SSL),但不降级 支持的。 net.sourceforge.spnego.SpnegoProvider.negotiate(SpnegoProvider.java:146) net.sourceforge.spnego.SpnegoAuthenticator.authenticate(SpnegoAuthenticator.java:271) net.sourceforge.spnego.SpnegoHttpFilter.doFilter(SpnegoHttpFilter.java:229)
我假设我的 httpclient 看到服务器现在支持 NTLM 并尝试执行 NTLM。有什么方法可以告诉我的 httpclient 甚至不用理会 NTLM?
【问题讨论】:
-
我认为问题在于服务器只支持NTLM。客户端请求服务器上的资源,服务器回复说需要 NTLM 授权,您的客户端回复说它不能做 NTLM,那么 Basic 怎么样?服务器说“对不起”并关闭了连接。所以我看到的答案是你不能不打扰 NTLM,因为服务器正在要求它。
-
这很可能是..有没有办法在不将 Fiddler 置于其间的情况下进行追踪(他们在生产环境中对此不屑一顾)?我只是想确保最终我可以确保我的客户甚至不会费心尝试使用 NTLM,但我还没有找到方法。类似于您可以启用/禁用对 SSL/TLS 版本的支持。
-
我觉得奇怪的是他们抱怨在生产环境中使用 Fiddler,因为它在客户端上运行。我经常使用的一个选项是 Burp Suite,它在您的客户端计算机上充当代理。您可以准确捕获和跟踪客户端和服务器之间发送的内容。您也可以自己滚动,因为它只是一个 TCP 事务,只需建立 TCP 连接并自己进行读写。或者对于真正喜欢冒险的人,使用 Telnet。
标签: c# dotnet-httpclient ntlm-authentication