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

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

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

尝试后我收到以下错误:

异常详细信息:System.ServiceModel.EndpointNotFoundException:由于endpointDisPatcher的地址不匹配,因此无法在接收器处理“ http://://://://service/wcfservice.svc”的消息。检查发件人和接收器的端点addresses是否同意。

经过一些研究,我发现 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 标记中指定的地址?或者我是否必须更改服务端点配置中的某些内容?

我们将非常感谢帮助和指导。

马可.

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

有帮助吗?

解决方案

您可以尝试用装饰你的服务类:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

其他提示

来处理这一个更安全的方法是,端点ListenUri设置为服务的URL,和端点地址到客户端发送消息的外部端点。通过这种方式,服务“信任”的消息仅定向到该地址,而不仅仅是的任何地址。

我不知道米奇·贝克的解决方案,从未尝试过。但这涉及修改生成的代码。还有另一种方法可以解决这个问题。

我假设您使用 svcutil.exe 生成客户端代码,并提供指向防火墙的 MEX 地址。当您执行此操作时,所需的所有配置都会添加到 App.config(或 Web.config)中。但是,配置中的服务地址将指向真实的服务地址(因为在 WSDL 文件中服务的地址仍然是真实服务的地址)。

所以,我认为可以解决这个问题:

  1. 通过提供 MEX 地址生成客户端代码(例如:http://:Port-X/service/wcfservice.svc?wsdl)。这将生成所有需要的配置。

  2. 调用客户端构造函数时,将防火墙的 URI 作为 EnpointAddress,并指定生成的配置的配置名称。这样,客户端将发送一条消息,就像将其发送到服务一样,但发送到防火墙的地址:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top