c# - 如何跨多个 HttpWebRequests 进行 'share' NTLM 身份验证?

标签 c# httpwebrequest ntlm networkcredentials

我的 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/

相关文章:

c# - 如何使 HttpWebRequest 异步

node.js - 如何查看 NTLM type3 消息? (node.js)

C# LINQ 查询

c# - 使用 LINQ C# 在 Array2 中查找 Array1 中恰好有两个项目的重复项

c# - Webresponse 对象出现 (500) 内部服务器错误

c# - HttpWebRequest:发布版本时访问被拒绝 - Xamarin (Android)

c# - 在 Windows 7 上调用 IPrincipal.IsInRole

spring-security - Spring 安全 3 + JCIFS ntlm

c# - NSURLSession 下载任务 - Xamarin iOS F#

c# - 无法从 NHibernate.Driver.OracleDataClientDriver 创建驱动程序