ためCustomCertificateValidatorを呼び出すように表示されます。WCFのServiceHostは、私はWCFのServiceHostのX509Certificate</p> <pre><code>Credentials.ServiceCertificate.Certificate = certificate; </code></pre> <p>とカスタムクライアント証明書の検証ツールを用いて固定したすべてのメッセージ
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ハンドシェイク、暗号ネゴシエーション、鍵交換と見なされますが、
2番目のメッセージが数秒後に、送信されたので、私は私が安全なセッションを持っているし、クライアントの証明書が送信されていないと想定され、該当する遅延はありません。
しかし、カスタムクライアント証明書バリデータはまだ呼ばれています!
私は間違って何をしていますか?
プロットは濃くなります! BasicHttpBindingでは、すべての呼び出しで新しいインスタンスがインスタンス化されるため、ホストのCustomCertificateValidatorはすべてのメッセージで呼び出されます。したがって、インスタンスコンテキストは常にPerCall with BasicHttpBindingです。 WSHttpBindingはセッションを許可しますが、他の意味があり、すべてのクライアントも変更する必要があります。うん! – MikeZ
これは学習経験でした。バインディングとそのセキュリティ設定は、サービスインスタンスの動作を制御します。 certifcate資格情報を持つBasicHttpBindingはSSLハンドシェイクを1回ネゴシエートしますが、すべての呼び出しで新しいサービスインスタンスが取得されます。特に、サービスインスタンスオブジェクトが軽量である限り、接続や切断を追跡して報告したいが、恐ろしいことではない場合は、迷惑です。 WSHttpBindingはSSLハンドシェイクを1回ネゴシエートし、サービスインスタンスを保持します。他のバインディングにはおそらく独自の動作があります。 – MikeZ