【问题标题】:Interesting issue with WCF wsHttpBinding through a FirewallWCF wsHttpBinding 通过防火墙的有趣问题
【发布时间】:2010-09-26 12:55:58
【问题描述】:

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

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

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

尝试后出现以下错误:

异常详细信息:System.ServiceModel.EndpointNotFoundException: 带有 To 'http://:/service/WCFService.svc' 的消息不能 由于 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"

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

我们将不胜感激帮助和指导。

马尔科。

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

【问题讨论】:

    标签: wcf firewall wshttpbinding ws-addressing


    【解决方案1】:

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

    [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • +1 - 但是,我仍然不清楚这对于部署到负载均衡器后面的多个服务器的服务将如何工作。我已经阅读了您的这篇很棒的帖子devproconnections.com/article/net-framework2/…
      • 这是正确的做法。您的网络管理员应该将请求从防火墙定向到托管您的服务的服务器,并且您应该在 web.config 中定义 listenUri 以响应定向请求。我有许多服务托管在多个服务器上,负载均衡器配置如下。此配置也适用于 SSL 终止符。
      【解决方案3】:

      我不知道 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"));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        相关资源
        最近更新 更多