【问题标题】:IIS7 Windows authentication causes 0x2746 SocketExceptionIIS7 Windows 身份验证导致 0x2746 SocketException
【发布时间】:2013-11-17 16:33:54
【问题描述】:

我在 Win2008R2 上的 IIS7 下托管 WCF 服务。它可以正常运行数周,然后当我们执行诸如重启服务器之类的操作时,通常是由于部署,它开始遇到如下错误:

System.ServiceModel.Security.MessageSecurityException: HTTP 请求未经客户端身份验证方案“协商”的授权。从服务器收到的身份验证标头是“Basic realm="myrealm.local",Negotiate,NTLM'。 System.Net.WebException: 远程服务器返回错误:(401) Unauthorized.

我已尝试重新启动所有软件,但没有效果。然后我重新启动服务器本身,它变成了一个错误说明:

[SocketException (0x2746): 现有连接被远程主机强行关闭] [IOException:无法将数据写入传输连接:现有连接被远程主机强行关闭。] [WebException:底层连接已关闭:发送时发生意外错误。] [CommunicationException:向 * 发出 HTTP 请求时发生错误。这可能是由于在 HTTPS 情况下未使用 HTTP.SYS 正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。]

IIS 日志仅显示它给出了 401 响应。 WFetch 显示一条消息 '0x2746 [sockslip]: recv()'

我已经排除了客户端、服务软件本身、服务器上的目录权限以及网络。

如果我打开匿名身份验证,一切正常;在仅启用 Windows 身份验证的情况下将其关闭,它会失败。

这看起来像是一个 IIS7 身份验证问题,但我不知道如何跟踪,因为 WCF 跟踪没有显示任何线索,并且服务器上没有记录任何异常。

澄清在过去,这个问题实际上似乎已经自行消失了,但是我发现一旦在打开匿名的情况下访问了该服务,当它关闭时,该服务继续在 Windows 身份验证中工作,直到下次重新启动。

问候, 抢。

【问题讨论】:

  • 我强烈建议您将所有 Negotiate/Windows 身份验证实例替换为 NTLM。 Negotiate = Kerberos,这在大多数情况下是矫枉过正的。 Kerberos 在 Windows 环境中也可能非常不稳定,因为它可能失败的原因有很多。此外,由于这一切都被抽象出来了,当它失败时,您获得的唯一信息是 401 错误,这可能意味着从 AD 设置错误到时钟同步问题(这是我要花钱的地方)。

标签: .net wcf iis-7 windows-server-2008 windows-authentication


【解决方案1】:

好的,事实证明这是我遇到的最容易误导的 Microsoft 错误消息之一。

当您尝试访问嵌套在另一个应用程序文件夹或网站下的应用程序文件夹时,会发生套接字异常。

例如

Website A
|
|--> Application B

如果 A 的身份验证设置配置错误或有问题,当您尝试直接访问 B 时,您会得到套接字异常而不是真正的答案。似乎 IIS 无法从您尝试访问的应用程序中报告错误,因为它无法“钻取”底层站点结构。

为了摆脱套接字异常并查看真正的 401 异常,我只是在 A 上启用了匿名身份验证,允许绕过该级别的任何问题,并导致错误来自应用程序 B。


在初始请求中创建了 401 身份验证错误,事件查看器中没有记录任何异常。

答案似乎是使用 system.webServer -> httpErrors

因为我想在 URL 中使用波浪号 (~),所以我将我的配置设置为以下内容:

<httpErrors>
  <clear />
  <error statusCode="401" responseMode="ExecuteURL" path="~/error.xml" />
</httpErrors>

不管是使用波浪号,还是ExecuteURL,我最终发现使用如下的作品:

<httpErrors>
  <clear />
  <error statusCode="401" responseMode="File" path="/error.xml" />
</httpErrors>

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2011-07-30
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多