5

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

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

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

尝试后我收到以下错误:

异常详细信息:System.ServiceModel.EndpointNotFoundException:由于 EndpointDispatcher 的 AddressFilter 不匹配,接收方无法处理带有“http://:/service/WCFService.svc”的消息。检查发送方和接收方的 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 标记中指定的地址?或者我是否必须更改我的服务端点配置中的某些内容?

帮助和指导将不胜感激。

马尔科。

PS:虽然我找到了任何解决方案,但我使用 basicHttpBinding 当然绝对没有问题。

4

3 回答 3

7

您可以尝试使用以下方式装饰您的服务类:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
于 2008-12-12T07:24:32.207 回答
4

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

于 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 回答