代码之家  ›  专栏  ›  技术社区  ›  sharppanda

使用IIS上的协商进行身份验证时,HTTP Post和Put在特定工作站上返回401未授权。windows集成身份验证

  •  1
  • sharppanda  · 技术社区  · 8 年前

    我们在少量工作站(Windows 7)上有一个奇怪的行为。 我们的.NET客户端正在与托管在IIS中的REST Api服务(Web Api 2)通信。 客户端使用System.Net.Http。HttpClient访问Api,并针对.NET Framework 4.5.2。 Api配置为使用Windows集成身份验证(协商,NTLM)。

    当客户端使用HTTPGET/DELETE调用Api时,一切都正常工作。 当客户端使用HTTP POST/PUT调用Api时(数据通过请求体发送)。IIS响应401未授权。

    这个问题消失了:

    • 在客户端工作站上运行Fiddler代理时。
    • IIS身份验证配置为仅使用NTLM

    我浏览了许多博客帖子和文章,但没有找到解决方案。

    Signer表现出同样的怪异行为。 客户端还使用信号器与服务通信。客户端可以连接到集线器并接收消息。但在尝试调用方法时获取401(信号器调用使用POST完成)。由于客户端在Windows 7上,因此不支持WebSocket。两种传输上的行为相同(服务器发送事件、长轮询)。其行为类似于: SignalR net45 gives 401 Unauthorized on specific user/machine combinations .还修复了(使用Microsoft.AspNet.signer.Client.2.2.0\ lib\net40 \Microsoft.AspNet.signer.Client。dll)也适用于信号器。

    编辑: 信号器net40不使用System.Net.Http中的HttpClient。因此,错误必须连接到System.Net。Http库。

    非常感谢您的建议。

    1 回复  |  直到 7 年前
        1
  •  0
  •   sharppanda    8 年前

    可能的解决方法是:

    • 设置 System.Net.ServicePointManager.Expect100Continue = false; 在创建任何HttpClient实例之前
    • 禁用此选项100在HttpClient上继续

      var c = new HttpClient();
      c.DefaultRequestHeaders.ExpectContinue = false;