由于kerberos时钟偏差导致WCF服务的延迟MSMQ消息失败

时间:2015-11-04 12:28:22

标签: wcf iis msmq kerberos netmsmqbinding

我正在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>

这应该如何运作?我错过了什么?

修改

This page确实说明了“使用Kerberos协议进行排队通信的问题在于,包含密钥分发中心(KDC)分发的客户端身份的故障单是相对短暂的。”,但是它没有真正说明什么时候有用。

关于kerberos消息安全性的美妙之处在于它几乎开箱即用,有人应该考虑过这种情况吧?

编辑2:

我验证了两台服务器上的时间,并且客户端(DC01是域控制器)的偏差约为0.1秒:

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  [                           *                           ]

1 个答案:

答案 0 :(得分:0)

嗯......听起来有点像I blogged about的东西。 45秒似乎是最大的延迟。