【发布时间】: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 的绑定是WebHttpBinding 和Mode=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