【发布时间】: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