2015-11-04 85 views
1

我正在IIS上運行帶有netMsmqBinding的WCF服務。它被配置爲使用'Windows'客戶端憑證類型的'消息'安全性,該類型使用kerberos來加密和簽署消息。服務合同執行ProtectionLevel.EncryptAndSign。注意到交易正在從客戶到服務使用可能很重要。由於kerberos時鐘歪斜導致WCF服務延遲的MSMQ消息失敗

服務運行時,通信工作完美無缺。但是,爲了測試延遲消息的持久性或服務無法訪問時,我暫時禁用了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票據來加密郵件,但由於WCF服務在10分鐘後解密了郵件(至少),所以它檢測到時鐘歪斜。當然,我手動驗證客戶端和服務器上的時鐘,但它們是相同的。

客戶端配置:

<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:

我驗證時兩臺服務器上和歪斜是用於在客戶端約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 [       *       ] 

回答

0

嗯...聽起來依稀有點像I blogged about。 45秒似乎是最大的延遲。

+0

我讀到你使用公共隊列,但我只需要私人隊列。另外,我用時間同步信息更新了問題。這個問題只發生在信息延遲時(有意)。 – JohanG

+0

忽略對公共隊列的引用 - 這是不重要的。這是使用Kerberos的相關性和時間的影響。例如,如果延遲時間僅爲30秒,它會起作用,但不會持續一分鐘嗎? –

+1

啊,我可能誤解了。我只測試了10秒,30秒,1分鐘,2分鐘,3分鐘,4分鐘和5分鐘,只有5分鐘的停機時間不起作用。我已經得出結論,kerberos並不意味着延遲信息。這也意味着5分鐘的時間偏差不僅僅是爲了補償時鐘差異,而且是運輸時間。 – JohanG