我正在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 [ * ]
我讀到你使用公共隊列,但我只需要私人隊列。另外,我用時間同步信息更新了問題。這個問題只發生在信息延遲時(有意)。 – JohanG
忽略對公共隊列的引用 - 這是不重要的。這是使用Kerberos的相關性和時間的影響。例如,如果延遲時間僅爲30秒,它會起作用,但不會持續一分鐘嗎? –
啊,我可能誤解了。我只測試了10秒,30秒,1分鐘,2分鐘,3分鐘,4分鐘和5分鐘,只有5分鐘的停機時間不起作用。我已經得出結論,kerberos並不意味着延遲信息。這也意味着5分鐘的時間偏差不僅僅是爲了補償時鐘差異,而且是運輸時間。 – JohanG