在我的应用程序中几乎所有(安全)WCF服务端点,如果客户端的系统时钟在将来或过去设置得太远,我会从WCFs Clock Skew机制中获得异常(如下所述:{{3} })。
然而,实现我的Login()方法的一个端点永远不会抛出此异常,即使它启用了传输安全性(当然也不需要凭据)。
为什么“时钟偏差机制”不适用于此端点?也许是因为clientCredentialType设置为“None”?
举个例子,这是我的配置的简化版本:
<services>
<service name="Foo">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="binding1"
contract="IFoo" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="binding1" maxReceivedMessageSize="100000000">
<readerQuotas maxDepth="1000000000" maxArrayLength="1000000000" maxStringContentLength="1000000000" />
<security mode="Transport">
<transport clientCredentialType ="None"/>
</security>
<reliableSession enabled="false" />
</binding>
</wsHttpBinding>
</bindings>
答案 0 :(得分:2)
安全模式 - 安全模式=“传输” - 消息中不包含时间戳,该时间戳会导致MaxClockSkew验证忽略该消息而不会引发安全性异常。 将安全模式更改为安全模式=“TransportWithMessageCredential”,其中包括时间戳,并允许MaxClockSkew验证测试消息的时间增量。
答案 1 :(得分:1)
其他人有类似的问题:
Triggering MaxClockSkew when accessing WCF service
所以我认为你的配置不存在问题。
似乎是,如果它不使用机器时间,它不会检查机器之间是否存在时间差异。
您可以自己编程,在登录方法中将客户机时间作为参数发送,如果不同则抛出异常。