【问题标题】:Why doesn't my WCF endpoint throw a Max Clock Skew exception?为什么我的 WCF 端点不抛出 Max Clock Skew 异常?
【发布时间】:2011-03-26 22:26:04
【问题描述】:

对于我的应用程序中的几乎所有(安全)WCF 服务端点,如果客户端的系统时钟在未来或过去设置得太远,我会从 WCF 时钟倾斜机制中得到一个异常(在此处描述:http://www.danrigsby.com/blog/index.php/2008/08/26/changing-the-default-clock-skew-in-wcf/) .

但是,实现我的 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>     

【问题讨论】:

    标签: wcf wcf-security


    【解决方案1】:

    安全模式 - security mode="Transport" - 在消息中不包含时间戳,这会导致 MaxClockSkew 验证忽略消息并且不会引发安全异常。 将安全模式更改为 security mode="TransportWithMessageCredential",其中包含时间戳并允许 MaxClockSkew 验证来测试消息的时间增量。

    【讨论】:

      【解决方案2】:

      其他人也有类似的问题:

      Triggering MaxClockSkew when accessing WCF service

      所以我认为你的配置没有问题。

      看起来,如果它不使用机器时间,它不会检查机器之间是否存在时间差异。

      您可以自行编程,在登录方法中将客户端机器时间作为参数发送,如果不同,则抛出异常。

      【讨论】:

        猜你喜欢
        • 2010-12-09
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多