2

サード パーティの SOAP サービスに接続する必要があり、そのために WCF を使用しています。このサービスは Apache AXIS を使用して開発されたものであり、私たちはそれを制御することはできず、その動作を変更する影響力もありません。私たちが見ている問題は、要求が Web Services Security を使用してフォーマットされることを期待しているため、すべての正しい署名などを行っていることです。ただし、サードパーティからの応答は保護されていません。ワイヤーを盗聴すると、応答が正常に返されることがわかります (ただし、タイムスタンプや署名などはありません)。基礎となる .NET コンポーネントは、これをセキュリティ上の問題と見なすため、エラーとしてスローします。そのため、soap 応答を実際に受け取ることはありません。セキュリティで保護された要求を送信するために WCF フレームワークを構成する方法はありますが、応答にセキュリティ フィールドを期待しないでください。OASIS の仕様を見ると、そうではありません。

詳細については、次の例外があります。

受け取る例外は次のとおりです。

System.ServiceModel.Security.MessageSecurityException was caught
  Message="Security processor was unable to find a security header in the message. This might be because the message is an unsecured fault or because there is a binding mismatch between the communicating parties.   This can occur if the service is configured for security and the client is not using security."
  Source="mscorlib"
  StackTrace:
    Server stack trace:
       at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessageCore(Message& message, TimeSpan timeout)
       at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout)
       at System.ServiceModel.Security.SecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout, SecurityProtocolCorrelationState[] correlationStates)
       at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout)
       at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
       at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)

ちなみに、タイムスタンプを省略した場合、セキュリティ フィールドは想定されないという投稿をたくさん見てきました。これはオプションではありません - 私たちが通信しているサービスは、タイムスタンプを義務付けています。

4

3 に答える 3

2

おかしいあなたはこの質問をする必要があります。私は約1年前にこれを行う方法をマイクロソフトに尋ねました。当時、.NET 3.0を使用していたため、それは不可能でした。3.5の世界でそれが変わったかどうかはわかりません。しかし、いいえ、リクエストにセキュリティを追加し、レスポンスを空のままにする物理的な方法はありませんでした。

以前の雇用主では、要求で証明書を使用するWS-Securityヘッダーを必要とするモデルを使用しましたが、応答はセキュリティで保護されていませんでした。

これは、ASMX WebサービスとWSEで実行できますが、WCFv3.0では実行できません。

于 2008-09-15T14:57:20.683 に答える
2

構成だけでは解決できない可能性があります。私はAxxisとの統合作業を行う必要があり(私たちの終わりはWSE3 --WCFの祖先でした)、コードを記述してWSE3のパイプラインに貼り付け、Axxisからの応答をWSE3に渡す前にマッサージする必要がありました。幸いなことに、これらのハンドラーをパイプラインに追加するのは非常に簡単です。ハンドラーに入ると、SoapMessageのインスタンスを取得するだけで、タイムスタンプの削除など、必要な操作を実行できます。

于 2008-09-15T14:57:55.143 に答える