質問

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

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

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

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

例外の詳細:System.ServiceModel.EndpointNotFoundException:EndPointDispatcherでのアドレスフィルターの不一致により、「http://:/service/wcfservice.svc」へのメッセージは、受信者で処理できません。送信者と受信者のエンドポイントアドレスが同意していることを確認してください。

調べてみると、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アドレスは、安定した解決可能なURIを持つことができないエンドポイントで使用するために以下のよく知られているURIを定義します。 http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"

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

ご支援とご指導をよろしくお願いいたします。

マルコ。

追記:これに対する解決策は見つかりましたが、もちろん全く問題なくbasicHttpBindingを使用しています。

役に立ちましたか?

解決

あなたはとあなたのサービスクラスを飾る試してみてください

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

他のヒント

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

ミッチ・ベイカー氏の解決策については知りませんし、試したこともありません。ただし、これには生成されたコードの変更が必要になります。これを回避する別の方法があります。

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"));

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top