我的 C# 应用访问了使用 NTLM 身份验证的网络服务器。
我发现向服务器发出的每个请求(使用新的 HttpWebRequest)都经过了单独的身份验证。换句话说,每个请求都会产生 401 响应,然后在我获得实际响应之前会发生 NTLM 握手对话。
例如:
第一个 GET 请求:
-> GET xyz
<- 401 error (WWW-Authenticate:NTLM)
-> GET xyz (Authorization:NTLM base64stuff)
<- 401 error (WWW-Authenticate:NTLM base64stuff)
-> GET xyz (Authorization: base64stuff)
<- 200
后续请求:
-> GET xyz (Authorization:NTLM base64stuff)
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided?
-> GET xyz (Authorization: base64stuff)
<- 200
(最初,PreAuthenticate 设置为 false,后续请求看起来像第一个请求 - 即每个“请求”三个基础请求)
有没有办法通过后续的 HttpWebRequests“共享”对服务器的第一个请求执行的身份验证?
我想也许是 UnsafeAuthenticatedConnectionSharing
属性将允许我执行此操作,但对于应用程序中使用的所有 HttpWebRequest 对象将其设置为 true 无效。
但是如果我设置 PreAuthenticate
为真,在第一个请求之后,每个请求都会少一个 401 响应。
最佳答案
执行 NTLM 后发送的最后一个请求(产生 200 响应的请求)包含一个 auth header ,告诉服务器您拥有正确的凭据。
我不确定客户端类是否具有自己保留此 header 的功能,但如果您找到某种方法来保留此 header 并将其添加到您的后续请求中,它应该可以正常工作。
更新:NTLM 对连接进行身份验证,因此您需要使用 Keep-Alive header 保持连接打开。客户端类应该为此提供一些设置。
关于c# - 如何跨多个 HttpWebRequests 进行 'share' NTLM 身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7256176/