【问题标题】:WCF Endpoint Address using https (WebHttpBinding)使用 https (WebHttpBinding) 的 WCF 端点地址
【发布时间】:2017-06-27 05:51:53
【问题描述】:

我需要修改一个 WCF 端点绑定地址。以下是有关该问题的一些背景:

我有一个 NT 类服务(如果重要的话,不是 web 服务)。它会创建一个带有 Endpoint 的 System.ServiceModel.ServiceHost,其端点地址是这样创建的:

var epa = new EndpointAddress(string.Format("https://localhost:{0}/ServiceAPI/", 8181));

用于ServiceEndpoint 的绑定是WebHttpBindingMode=WebHttpSecurityMode.Transport(即https)。

ServiceHost 打开后,我可以进入命令提示符,执行“Netstat -a”,看到绑定到 Listen 的地址为 0.0.0.0:8181。

到目前为止,没问题。然而,一个大客户提出了一个“安全问题”,因为 WCF“侦听”在地址 0.0.0.0 而不是 127.0.0.1 上,潜在的攻击者可以从外部计算机连接到该地址。他们构建的测试是从外部机器使用telnet 8181,如果连接发生,则测试失败。更改请求是将服务修改为在 127.0.0.1:8181 上“侦听”,以便从本地计算机连接到该端口的唯一可能性。

我做了相当多的修改,试图让 WCF 在“127.0.0.1”而不是“0.0.0.0”上“监听”。在我所有的尝试中,唯一的方法是将HostNameComparisonMode 设置为“精确”并以这种方式创建端点地址:

var epa = new EndpointAddress(string.Format("https://127.0.0.1:{0}/ServiceAPI/", 8181));

(实际上,顺便说一句,如果我使用不同的绑定,例如NetTcpBinding,上面的EndPointAddress 构造绑定到地址“127.0.0.1:8181”而不改变 HostNameComparisonMode。当我使用 WebHttpBinding 时,它只会在内部切换到“0.0.0.0:8181”,并且无法设置 HostNameComparisonMode=Exact。)

但是,这(设置 HostNameComparisonMode=Exact)会导致复杂的问题,因为已经开发了现有的第 3 方代码,尝试(在服务器上)连接到“https://localhost:8181/ServiceAPI”,并且设置了 HostNameComparisonMode对于“Exact”,由于“localhost”和“127.0.0.1”之间的差异,WCF 只会向任何请求返回 http 错误 506。

我目前正在寻找的是将 WCF 设置为绑定到“127.0.0.1:8181”(由 netstat -a 确定)的一种方法,其中 HostNameComparisonMode 仍设置为默认的“StrongWildcard”设置。或者除非有办法做到这一点,否则另一个创造性的建议是导致来自外部机器的连接无法连接到该端口。 (测试是在另一台机器上使用“telnet servername 8181”,但连接失败。)

有什么想法吗?谢谢!

【问题讨论】:

  • 当要求只能从同一个盒子连接时,为什么要使用 https?
  • 这是一个相关的 Stack Overflow 帖子:stackoverflow.com/questions/15428610/…
  • 您好,同样的问题也出现在 http(即 WebHttpBinding 和 Transport.None)中,只有 NetTcpBinding 不会出现。如果有人问为什么不可选地使用 NetTcpBinding,那么,好吧,--- 通常,该应用程序需要来自其他盒子的连接,并使用 https: 进行保护。但是,一位特定的客户希望应用程序是可配置的,这样就无法从盒子外部访问它。
  • 客户端/服务器上的 https 方案是为一般客户选择的,同时考虑到一系列安全问题。一个客户正在寻求的是一种简单且可选择地关闭该端口的方法。

标签: c# wcf localhost ip-address endpoint-address


【解决方案1】:

如果我没听错的话,你想从远程机器连接到这个地址,那么你可以试试 BasicHttpBinding 吗?您也可以尝试将其托管在:"https://localhost:{0}/ServiceAPI/", 8181" 如果我​​理解错了,请纠正。

【讨论】:

  • 我将调查 BasicHttpBinding 的使用,并返回对我发现的评论。
  • BasicHttpBinding 也像 WebHttpBinding 一样在内部将绑定地址从“localhost”切换到“0.0.0.0”。
  • 好的,请尝试下一步:运行应用程序,在本地机器浏览器中输入“localhost:8181/ServiceAPI” - 通常您应该看到 wcf 服务器功能。然后尝试在远程机器浏览器中打开下一行:“IP of host machine:8181/ServiceAPI”——你得到了同样的结果吗?
  • 如果我将 HostNameComparisonMode 设置为 Exact,那么解决方案将失败,因为浏览到 localhost:8181/ServiceAPI 只会返回 http 错误 506,“服务器不可用”,即使我确实不能不再从盒子外面到达那个端口。这将是一个解决方案,除了它不再在本地工作,因为 HostNameComparisonMode.Exact 意味着(这里是一个参考链接:kennyw.com/?p=109
  • ....所以可以理解,“localhost”和“127.0.0.1”之间不匹配。为了使服务在本地工作,HostNameComparisonMode 必须设置为 StrongWildCard 以克服“localhost”和“127.0.0.1”之间的文本比较差异。但是,一旦我设置 HostNameComparisonMode=StrongWildCard,WCF 突然将地址绑定更改回 0.0.0.0,现在我可以从框外访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
相关资源
最近更新 更多