如何跨多个HttpWebRequests"共享"NTLM身份验证?

mac*_*nir 6 c# ntlm httpwebrequest networkcredentials

我的C#app点击使用NTLM身份验证的Web服务器.

我发现每个向服务器发出的请求(使用新的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
Run Code Online (Sandbox Code Playgroud)

后续要求:

-> GET xyz (Authorization:NTLM base64stuff)
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided?

-> GET xyz (Authorization: base64stuff)
<- 200
Run Code Online (Sandbox Code Playgroud)

(最初,在PreAuthenticate设置为false的情况下,后续请求看起来像第一个请求 - 即每个'请求'有三个基础请求)

有没有办法通过后续的HttpWebRequests"共享"第一次请求对服务器执行的身份验证?

我想也许该UnsafeAuthenticatedConnectionSharing属性允许我这样做,但是对于应用程序中使用的所有HttpWebRequest对象将其设置为true都没有效果.

但是,如果我设置PreAuthenticate为true,则在第一个请求之后,每个请求会发生少于401的响应.

Ira*_*chi 4

执行 NTLM 后发送的最后一个请求(导致 200 响应的请求)包含一个 auth 标头,告诉服务器您拥有正确的凭据。

我不确定客户端类是否具有自行保留此标头的功能,但如果您找到某种方法来保留此标头并将其添加到后续请求中,它应该可以正常工作。


更新:NTLM 对连接进行身份验证,因此您需要使用 Keep-Alive 标头保持连接打开。客户端类应该为此提供一些设置。