そこで最近、サービスを Java クライアントに公開しました。当社のサービスは、ユーザー名/パスワードの検証とともにトランスポート セキュリティを利用しています。
サービスを呼び出そうとすると、クライアントはセキュリティ ヘッダーに関する例外を受け取りました。さらに調査したところ、WCF は、クライアントから渡された SOAP ヘッダーにタイムスタンプが含まれていることを期待していることが示されました。これが存在しない場合 (または差異が 5 分を超える場合) は、例外がスローされます。
また、Java クライアントが WCF が期待するタイムスタンプを渡さないこともわかりました。私たちが見つけた唯一の回避策は、CustomBinding を実装し、IncludeTimestamp を false に設定することでした。これにより、クライアントはサービスを正常に呼び出すことができました。
今日、WCF を使用したセキュリティのベスト プラクティスを調べていると、MSDN で次のように表示されます。
カスタム バインディングで SecurityBindingElement.IncludeTimestamp を True に設定する
カスタム バインディングを作成するときは、IncludeTimestamp を true に設定する必要があります。それ以外の場合、IncludeTimestamp が false に設定されていて、クライアントが X509 証明書などの非対称キーベースのトークンを使用している場合、メッセージは署名されません。
それで、私の質問は、非 .NET クライアントに SSL (トランスポート) を利用しながら、WCF (および最終的には Web API) サービスを外部に公開するときのベスト プラクティスは何ですか?