2016-07-27 44 views
1

我有一個WCF ServiceHost的固定與一個X509CertificateWCF的ServiceHost似乎呼籲CustomCertificateValidator爲每封郵件

Credentials.ServiceCertificate.Certificate = certificate; 

和一個自定義客戶端證書驗證:

Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom; 
Credentials.ClientCertificate.Authentication.CustomCertificateValidator = new CustomX509CertificateValidator(); 

的InstanceContextMode和ConcurrencyMode是它們的默認值,PerSession和Single。

我的端點使用運輸的安全,需要一個客戶端證書:

BasicHttpBinding binding = new BasicHttpBinding(); 
binding.Security.Mode = BasicHttpSecurityMode.Transport; 
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 

AddServiceEndpoint(typeof(...), binding, endpoint); 

我想(和期望)的定製客戶端證書驗證一旦有新連接的SSL握手過程中被調用一次,但它是呼籲收到每條消息。

客戶端WCF跟蹤日誌顯示重要的流量,包括髮送第一條消息時的4秒延遲,我假設是SSL握手,密碼協商和密鑰交換,但我看不到字節。

client trace, first message

有當發送第二條消息沒有相應的延遲,幾秒鐘後,所以我想我有一個安全會議,並沒有被髮送客戶端的證書。

client trace, second message

但自定義客戶端證書的驗證仍然被稱爲!

我到底做錯了什麼?

+0

情節變厚了!主機的CustomCertificateValidator在每個消息上都被調用,因爲使用BasicHttpBinding,每次調用都會實例化一個新實例。所以實例上下文始終是帶有BasicHttpBinding的PerCall。 WSHttpBinding允許會話,但還有其他含義,所有客戶端也需要更改。啊! – MikeZ

+0

這是一次學習體驗。綁定及其安全設置可以控制服務實例的行爲。具有certifcate憑證的BasicHttpBinding將一次協商SSL握手,但在每次調用中仍會獲得新的服務實例。這很煩人,特別是如果你想跟蹤和報告連接和斷開連接,但不是很糟糕,只要你的服務實例對象是輕量級的。 WSHttpBinding將一次協商SSL握手,並保留該服務實例。其他綁定可能有其獨特的行爲。 – MikeZ

回答

0

既然我們更好地理解了服務實例行爲,我們決定採用BasicHttpBinding綁定的行爲。

我們希望記錄由我們的遠程SSL客戶端頒發的證書的證書過期信息,但是當每個消息都被調用驗證器時,我們無法輕鬆完成此操作。真可惜。

我們沒有看到在服務中更改綁定的簡單方法,也沒有更改所有客戶端的綁定。

我真的很喜歡WCF,但服務實例行爲受綁定和安全性選擇影響的方式沒有很好的記錄。