HTTP Post 和 Put returns 401 在使用 IIS windows 集成身份验证上的协商进行身份验证时在特定工作站上未经授权
HTTP Post and Put returns 401 Unauthorized on specific workstations when authenticating using Negotiate on IIS windows integrated authentication
我们在少量工作站 (Windows 7) 上有一个奇怪的行为。
我们的 .NET 客户端正在与托管在 IIS 中的 REST Api 服务 (Web API 2) 通信。
客户端使用 System.Net.Http.HttpClient 访问 Api 并针对 .NET Framework 4.5.2。
Api 配置为使用 Windows 集成身份验证(协商、NTLM)。
当客户端使用 HTTP GET/DELETE 调用 Api 时,一切正常。
当客户端使用 HTTP POST/PUT 调用 Api 时(数据通过请求正文发送)。 IIS 响应 401 Unauthorized。
这个问题消失了:
- 当 运行 客户端工作站上的 Fiddler 代理时。
- IIS 身份验证配置为仅使用 NTLM
我浏览了很多博客-posts 和文章,但没有找到解决方案。
- Fiddler 修复了我的应用程序 http://www.telerik.com/blogs/help!-running-fiddler-fixes-my-app-
- Kerberos 身份验证疑难解答https://blogs.msdn.microsoft.com/friis/2009/12/31/things-to-check-when-kerberos-authentication-fails-using-iisie/
SignalR 表现出同样的怪异行为。
客户端还使用 SignalR 与服务通信。客户端可以连接到集线器并接收消息。但是在尝试调用方法时得到 401(signalR 调用是使用 POST 完成的)。由于客户端在 Windows 7 上,它不支持 WebSockets。两种传输方式(服务器发送的事件、长轮询)的行为相同。它与 的行为类似。此 post 中的修复(使用 Microsoft.AspNet.SignalR.Client.2.2.0\ lib\net40 \Microsoft.AspNet.SignalR.Client.dll)也作为SignalR 很好。
编辑: SignalR net40 不使用来自 System.Net.Http 的 HttpClient。所以报错一定是连接到System.Net.Http库
非常感谢您的任何建议。
可能的解决方法是:
- 在创建 HttpClient 的任何实例之前设置
System.Net.ServicePointManager.Expect100Continue = false;
在 HttpClient 上禁用此 100Continue
var c = new HttpClient();
c.DefaultRequestHeaders.ExpectContinue = false;
我们在少量工作站 (Windows 7) 上有一个奇怪的行为。 我们的 .NET 客户端正在与托管在 IIS 中的 REST Api 服务 (Web API 2) 通信。 客户端使用 System.Net.Http.HttpClient 访问 Api 并针对 .NET Framework 4.5.2。 Api 配置为使用 Windows 集成身份验证(协商、NTLM)。
当客户端使用 HTTP GET/DELETE 调用 Api 时,一切正常。 当客户端使用 HTTP POST/PUT 调用 Api 时(数据通过请求正文发送)。 IIS 响应 401 Unauthorized。
这个问题消失了:
- 当 运行 客户端工作站上的 Fiddler 代理时。
- IIS 身份验证配置为仅使用 NTLM
我浏览了很多博客-posts 和文章,但没有找到解决方案。
- Fiddler 修复了我的应用程序 http://www.telerik.com/blogs/help!-running-fiddler-fixes-my-app-
- Kerberos 身份验证疑难解答https://blogs.msdn.microsoft.com/friis/2009/12/31/things-to-check-when-kerberos-authentication-fails-using-iisie/
SignalR 表现出同样的怪异行为。
客户端还使用 SignalR 与服务通信。客户端可以连接到集线器并接收消息。但是在尝试调用方法时得到 401(signalR 调用是使用 POST 完成的)。由于客户端在 Windows 7 上,它不支持 WebSockets。两种传输方式(服务器发送的事件、长轮询)的行为相同。它与
编辑: SignalR net40 不使用来自 System.Net.Http 的 HttpClient。所以报错一定是连接到System.Net.Http库
非常感谢您的任何建议。
可能的解决方法是:
- 在创建 HttpClient 的任何实例之前设置
System.Net.ServicePointManager.Expect100Continue = false;
在 HttpClient 上禁用此 100Continue
var c = new HttpClient(); c.DefaultRequestHeaders.ExpectContinue = false;