我有一個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握手,密碼協商和密鑰交換,但我看不到字節。
有當發送第二條消息沒有相應的延遲,幾秒鐘後,所以我想我有一個安全會議,並沒有被髮送客戶端的證書。
但自定義客戶端證書的驗證仍然被稱爲!
我到底做錯了什麼?
情節變厚了!主機的CustomCertificateValidator在每個消息上都被調用,因爲使用BasicHttpBinding,每次調用都會實例化一個新實例。所以實例上下文始終是帶有BasicHttpBinding的PerCall。 WSHttpBinding允許會話,但還有其他含義,所有客戶端也需要更改。啊! – MikeZ
這是一次學習體驗。綁定及其安全設置可以控制服務實例的行爲。具有certifcate憑證的BasicHttpBinding將一次協商SSL握手,但在每次調用中仍會獲得新的服務實例。這很煩人,特別是如果你想跟蹤和報告連接和斷開連接,但不是很糟糕,只要你的服務實例對象是輕量級的。 WSHttpBinding將一次協商SSL握手,並保留該服務實例。其他綁定可能有其獨特的行爲。 – MikeZ