5

インターネット ホスティング プロバイダーにデプロイされた Web アプリケーションがあります。この Web アプリケーションは、会社のアプリケーション サーバーにある IIS サーバーに展開された WCF サービスを使用します。会社のデータベースにデータ アクセスするために、ネットワーク担当者は、セキュリティ上の理由から、ファイアウォールを介してこの WCF サービスを公開することを許可しました。ダイアグラムは次のようになります。

[ホストされたページ] ---> (インターネット) ---> |ファイアウォール<Public IP>:<Port-X >| ---> [IIS と WCF サービス<Comp. Network Ip>:<Port-Y>]

また、wsHttpBinding を使用して、そのセキュリティ機能を利用し、重要な情報を暗号化したいと考えていました。

試してみると、次のエラーが表示されます。

例外の詳細: System.ServiceModel.EndpointNotFoundException: To 'http://:/service/WCFService.svc' を含むメッセージは、EndpointDispatcher での AddressFilter の不一致により、受信側で処理できません。送信者と受信者の EndpointAddresses が一致していることを確認してください。

調査の結果、wsHttpBinding が WS-Addressing 標準を使用していることがわかりました。この標準について読んで、SOAP ヘッダーが拡張され、「MessageID」、「ReplyTo」、「Action」、「To」などのタグが含まれていることがわかりました。

クライアント アプリケーションのエンドポイントがファイアウォールの IP アドレスとポートを指定し、サービスがファイアウォールの IP とは異なる内部ネットワーク アドレスで応答するため、WS-Addressing が上記のメッセージを送信すると推測しています。これは非常に優れたセキュリティ対策だと思いますが、私のシナリオではあまり役に立ちません。

WS-Addressing 標準提出の引用 ( http://www.w3.org/Submission/ws-addressing/ )

「現在広く使用されているさまざまなネットワーク技術 (NAT、DHCP、ファイアウォールなど) のため、多くの展開では、特定のエンドポイントに意味のあるグローバル URI を割り当てることができません。これらの「匿名」エンドポイントがメッセージ交換パターンを開始できるようにするには、 WS-Addressing は、安定した解決可能な URI を持つことができないエンドポイントで使用する次の既知の URI を定義します。 http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous "

ファイアウォールの IP アドレスを指定し、SOAP メッセージ ヘッダーの「To」WS-Addressing タグで指定されたアドレスを無視またはバイパスするように wsHttpBinding エンドポイントを構成するにはどうすればよいですか? または、サービス エンドポイント構成で何かを変更する必要がありますか?

ヘルプとガイダンスをいただければ幸いです。

マルコ。

PS:これに対する解決策を見つけましたが、basicHttpBindingを使用していますが、もちろん問題はありません。

4

3 に答える 3

4

これを処理するより安全な方法は、エンドポイント ListenUri をサービス Url に設定し、エンドポイント Address をクライアントがメッセージを送信する外部エンドポイントに設定することです。このようにして、サービスは、任意のアドレスだけでなく、そのアドレスのみに向けられたメッセージを「信頼」します。

于 2010-03-15T05:14:19.903 に答える
2

Mitch Baker からの解決策については知りません。試したことはありません。ただし、これには生成されたコードの変更が伴います。それを回避する別の方法があります。

svcutil.exe を使用してクライアント コードを生成し、ファイアウォールを指す MEX アドレスを指定したとします。これを行うと、必要なすべての構成が App.config (または Web.config) に追加されます。ただし、構成内のサービスのアドレスは実際のサービス アドレスを指します (WSDL ファイルでは、サービスのアドレスは実際のサービスのアドレスのままです)。

だから、私はこの問題を解決すると思います:

  1. MEX アドレスを指定してクライアント コードを生成します (例: http://:Port-X/service/wcfservice.svc?wsdl)。これにより、必要な構成がすべて生成されます。

  2. クライアント コンストラクターを呼び出すときに、ファイアウォールの URI を EnpointAddress として指定し、生成された構成の構成名を指定します。このように、クライアントはメッセージをサービスに送信しているかのように送信しますが、ファイアウォールのアドレスに送信します。

    client = new ServiceClient(endpointConfigName, new System.ServiceModel.EndpointAddress("http://:Port-X/service/wcfservice.svc"));

于 2008-12-12T08:20:36.883 に答える