2016-07-27 4 views
1

Ich habe einen WCF Servicehost mit einem X509Certificate gesichertWCF Servicehost erscheint CustomCertificateValidator für jede Nachricht zu nennen

Credentials.ServiceCertificate.Certificate = certificate; 

und einem benutzerdefinierten Client-Zertifikat Validator:

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

Die InstanceContextMode und ConcurrencyMode sind die Standardwerte , PerSession und Single.

Mein Endpunkt verwendet Transportsicherheit und erfordert ein Client-Zertifikat:

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

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

ich will (und erwarten) die benutzerdefinierte Client-Zertifikat Validator einmal aufgerufen werden, während des SSL-Handshake auf einer neuen Verbindung, aber es ist rief jede empfangene Nachricht an.

Client-Seite WCF Trace-Protokoll zeigt erheblichen Verkehr, einschließlich einer Verzögerung von 4 Sekunden, wenn die allererste Nachricht gesendet wird, nehme ich an, dass das ist der SSL-Handshake, Verschlüsselung und Schlüsselaustausch, aber ich kann die Bytes nicht sehen.

client trace, first message

Es gibt keine entsprechende Verzögerung ist, wenn die zweite Nachricht ein paar Sekunden später, gesendet wird, so gehe ich davon aus Ich habe eine gesicherte Sitzung und das Zertifikat des Clients gesendet wird nicht eingehalten.

client trace, second message

Aber die benutzerdefinierte Client Zertifikatvalidierer noch genannt wird!

Was zum Teufel mache ich falsch ?!

+0

Die Handlung verdichtet sich! Der CustomCertificateValidator des Hosts wird für jede Nachricht aufgerufen, da bei einer BasicHttpBinding-Instanz bei jedem Aufruf eine neue Instanz instanziiert wird. Der Instanzkontext ist also immer PerCall mit BasicHttpBinding. WSHttpBinding ermöglicht Sitzungen, aber es gibt andere Auswirkungen und alle Clients müssten auch geändert werden. Pfui! – MikeZ

+0

Dies war eine Lernerfahrung. Die Bindung und ihre Sicherheitseinstellungen steuern das Verhalten der Serviceinstanzen. BasicHttpBinding mit Zertifikatsnachweisen wird den SSL-Handshake einmal aushandeln, aber Sie erhalten immer noch eine neue Dienstinstanz bei jedem Aufruf. Es ist ärgerlich, besonders wenn Sie Verbindungen und Verbindungsunterbrechungen verfolgen und melden möchten, aber nicht schlimm, solange Ihr Service-Instanzobjekt leicht ist. WSHttpBinding verhandelt den SSL-Handshake einmal und Sie behalten die Dienstinstanz. Andere Bindungen haben wahrscheinlich ihr eigenes einzigartiges Verhalten. – MikeZ

Antwort

0

Nachdem wir das Verhalten von Serviceinstanzen besser verstanden haben, haben wir uns entschieden, mit dem Verhalten der BasicHttpBinding-Bindung zu leben.

Wir hatten gehofft, Zertifikat Ablaufinformationen für die Zertifikate von unseren Remote-SSL-Clients angezeigt werden, aber wir können nicht so einfach, wenn der Validator für jede Nachricht aufgerufen wird. Eine Schande wirklich.

Wir sehen keine einfache Möglichkeit, die Bindung im Service zu ändern, ohne die Bindungen bei allen Clients zu ändern.

Ich mag WCF wirklich, aber die Art und Weise, wie das Verhalten der Serviceinstanzen von der Wahl der Bindung und Sicherheit beeinflusst wird, ist nicht sehr gut dokumentiert.

Verwandte Themen