WCF wsHttpBinding通过防火墙的有趣问题

时间:2008-12-11 21:34:15

标签: wcf firewall wshttpbinding ws-addressing

我在互联网托管服务提供商中部署了一个Web应用程序。此Web应用程序使用部署在我公司应用程序服务器的IIS服务器上的WCF服务,以便能够访问公司的数据库,网络人员允许我出于安全原因通过防火墙公开此WCF服务。图表看起来像这样。

  

[托管页面] ---&gt; (互联网)---&gt; |防火墙<Public IP>:<Port-X > |   ---&GT; [带有WCF服务的IIS <Comp. Network Ip>:<Port-Y>]

我还想使用wsHttpBinding来利用其安全功能,并加密敏感信息。

尝试后,我收到以下错误:

  

异常详细信息:System.ServiceModel.EndpointNotFoundException:The   To'http://:/ service / WCFService.svc'的消息不能   由于地址过滤器不匹配而在接收器处理   EndpointDispatcher。检查发件人和收件人   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

我如何配置我的wsHttpBinding端点以解决我的防火墙IP并忽略或绕过SOAP消息头中“To”WS-Addressing标记中指定的地址?或者我是否必须在服务端点配置中更改某些内容?

非常感谢帮助和指导。

马尔科。

P.S。:虽然我找到了解决方法,但我当然使用basicHttpBinding绝对没问题。

3 个答案:

答案 0 :(得分:6)

您可以尝试使用以下命令修改服务类:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

答案 1 :(得分:4)

更安全的方法是将端点ListenUri设置为服务Url,将端点Address设置为客户端发送消息的外部端点。这样,服务“信任”仅指向该地址的消息,而不仅仅是任何地址。

答案 2 :(得分: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”));