我在 IIS 上运行带有 netMsmqBinding 的 WCF 服务。它被配置为使用带有“Windows”客户端凭据类型的“消息”安全性,它使用 kerberos 来加密和签署消息。服务合同强制执行 ProtectionLevel.EncryptAndSign。值得注意的是,从客户端到服务正在使用事务。
当服务运行时,通信完美无缺。但是,为了测试延迟消息的持久性或当服务无法访问时,我在 IIS 中暂时禁用了该服务的应用程序池。然后我从客户端发送一条消息。它将传出队列留在客户端计算机上,然后传输到服务器上的专用队列。.NET MSMQ 侦听器获取消息并尝试调用 WCF 服务方法,但按预期失败。大约 10 分钟后,我重新启用了应用程序池。在服务跟踪日志中,记录了以下异常:
System.ServiceModel.Security.MessageSecurityException:
"Message security verification failed."
System.IdentityModel.Tokens.SecurityTokenException:
"The AcceptSecurityContext failed."
System.ComponentModel.Win32Exception:
"The clocks on the client and server machines are skewed"
我还通过在服务器上使消息队列服务脱机来尝试相同的方案。结果是一样的。
我的猜测是客户端获得了 kerberos 票证来加密消息,但是因为消息在 10 分钟后被 WCF 服务解密(至少),所以它检测到时钟偏差。当然,我手动验证了客户端和服务器上的时钟,但它们是相同的。
客户端配置:
<bindings>
...
<netMsmqBinding>
<binding>
<security mode="Message">
<message clientCredentialType="Windows" />
</security>
</binding>
</netMsmqBinding>
</bindings>
<client>
...
<endpoint address="net.msmq://host/private/service/service.svc"
binding="netMsmqBinding"
contract="Namespace.Contract" />
</client>
服务器配置:
<bindings>
...
<netMsmqBinding>
<binding receiveErrorHandling="Reject">
<security mode="Message">
<message clientCredentialType="Windows" />
</security>
</binding>
</netMsmqBinding>
</bindings>
<serviceActivations>
...
<add relativeAddress="service.svc"
service="Namespace.Contract"
factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"/>
</serviceActivations>
<services>
...
<service name="Namespace.Contract">
<endpoint address="net.msmq://localhost/private/service/service.svc"
binding="netMsmqBinding"
contract="Namespace.IContract" />
</service>
</services>
这应该如何工作?我错过了什么?
编辑:
此页面确实说明了“使用 Kerberos 协议进行排队通信的问题在于密钥分发中心 (KDC) 分发的包含客户端身份的票证的寿命相对较短。”,但它并没有真正详细说明何时它可能很有用。
kerberos 消息安全的美妙之处在于它几乎可以开箱即用,有人应该考虑过这种情况,对吧?
编辑2:
我验证了两台服务器上的时间,两个客户端的偏差约为 0.1 秒(DC01 是域控制器):
C:\>w32tm /stripchart /computer:DC01 /samples:5
Tracking DC01 [10.1.1.2:123].
Collecting 5 samples.
The current time is 04-11-2015 16:49:17.
16:49:17 d:+00.0000000s o:-00.1020864s [ * ]
16:49:19 d:+00.0000000s o:-00.1020897s [ * ]
16:49:21 d:+00.0000000s o:-00.1020896s [ * ]
16:49:23 d:+00.0000000s o:-00.1020952s [ * ]
16:49:25 d:+00.0000000s o:-00.1021011s [ * ]
和服务器:
C:\>w32tm /stripchart /computer:DC01 /samples:5
Tracking DC01 [10.1.1.2:123].
Collecting 5 samples.
The current time is 04-11-2015 16:49:17.
16:49:17 d:+00.0000000s o:-00.1171919s [ * ]
16:49:19 d:+00.0000000s o:-00.1360460s [ * ]
16:49:21 d:+00.0000000s o:-00.1237094s [ * ]
16:49:23 d:+00.0000000s o:-00.1269640s [ * ]
16:49:25 d:+00.0000000s o:-00.1302236s [ * ]