2011-08-31 21 views
5

我的C#应用​​程序访问使用NTLM身份验证的Web服务器。如何跨多个HttpWebRequest共享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 

(最初,与预先验证设置为false,后续请求看起来像第一个请求 - 即每个“请求”有三个底层请求)

是否有用后续的HttpWebRequests将第一个请求上执行的认证“共享”到服务器的方式?

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

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

+0

什么问题是你想解决? –

+0

我想有效'做认证'一次,并跨HttpWebRequests重复使用。而不是每次我点击服务器时进行身份验证。尽管我可能会误解NTLM,实际上NTLM会对每个请求额外请求开销。 – mackenir

+0

是的,但现在它的工作方式有什么问题,它将如何解决将您描述的行为改变为您所期望的行为的问题,您想在现实世界中实现什么。 –

回答

3

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

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


更新:NTLM验证连接,因此您需要使用Keep-Alive头保持连接打开状态。客户端类应为此提供一些设置。欲了解更多信息,请参阅此页,我觉得这对NTLM方案非常有用的,明确的:

http://www.innovation.ch/personal/ronald/ntlm.html

+0

嗯。可以在HttpWebRequest上设置授权标头,我试过了。然而,它不起作用 - 服务器返回400错误请求,表明授权标头不能以这种方式“重播”。出于安全原因,我认为这是有道理的。 – mackenir

+0

查看我上面的编辑 – Iravanchi

+0

经过一小段时间的测试,看起来像,尽管HttpWebRequest有一个KeepAlive属性,但它不会改进PreAuthenticate = true的设置。有点烦人。 – mackenir