【问题标题】:How to avoid use a WCF service from unknown client如何避免使用来自未知客户端的 WCF 服务
【发布时间】:2014-01-13 02:09:06
【问题描述】:

我正在开发一个 Windows 窗体应用程序,该应用程序使用我开发的 WCF 服务,托管在互联网付费主机上。

在我的 WCF 服务上,我有一些 OperationContracts 来为 Windows 窗体客户端提供一些功能。 如果我在我的 Windows 窗体客户端中设置指向我的 WCF 服务的新服务引用,我可以使用该 OperationContracts。到目前为止没有问题。

如果有人“知道”我的 WCF 服务的地址,任何人都可以在他/她的“自己的”客户端应用程序中使用我的“自己的”WCF 服务。

使用像 Wireshark 这样的工具来检索 WCF 服务 url 非常简单。

所以,我的问题...有某种保护措施可以避免这种情况? 我不希望“其他客户”使用我自己的 WCF 服务。

PS:无法在我的付费主机上使用 SSL 证书。

【问题讨论】:

  • 添加引用不是什么大问题..但是你可以把authentication这样只有有效的客户端才能访问功能(操作合同)。
  • 您是否真的希望只有您的客户才能访问该服务,或者您是否真的关心确保只有授权用户才能访问,而不管他们使用的是什么客户端。不可能 100% 确保只有您的客户才能调用您的服务。另一方面,很容易确保只有授权用户可以。
  • 阅读这个 msdn 链接 (msdn.microsoft.com/en-us/library/ff405740.aspx) 我看到有一些身份验证方法(Windows、Basic、证书、NTLM 或无)我不能使用其中任何一个。 Windows 显然不是。我的应用程序不是域应用程序,基本都不是(用一些“反射器”打开它并在纳秒内获取用户/通过),NTLM 也不是(如 Windows auth),最后可能是证书,但我不明白它是如何工作的。

标签: c# wcf web-services


【解决方案1】:

您应该为您的服务添加身份验证。身份验证可以使用不同的技术: 用户名-密码、证书等。 关于最简单的用户名密码验证,您可以阅读here

【讨论】:

  • 您链接的文章仍然需要证书 - “要使用户名密码身份验证正常工作,您的服务器托管服务需要 X509 证书”
  • 如果你会使用 https 那就不是。
  • ... 但是你必须有一个证书才能使用 https!
  • 你想让我说什么?此证书用于传输安全,而不是用于身份验证。
  • 也许我不理解你,但最初的问题是 OP 不能在他们的主机上使用 SSL 证书......
【解决方案2】:

不是 100% 确定这是您要查找的内容,即使是我也建议您实施某种授权,但您可以通过将 httpGetEnabled 属性设置为来禁用服务的 WSDL服务配置文件中的 false:

<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

这将禁用 WSDL 的发布(至少据我了解)。因此,将服务引用添加到您的应用程序,然后将值设置为“false”。即使有人嗅探到您的服务地址,他们也无法拉取 WSDL 来生成代理。

编辑

为了澄清,将上面的属性设置为 false 不会隐藏服务 URL - 它只是禁用 WSDL。任何知道您的服务 URL 但没有有代理的人都需要 WSDL 来生成代理。 httpGetEnabled="false" 阻止提供 WSDL,从而阻止生成代理。

由于您不能在您的托管站点上使用 SSL 证书,自定义用户名验证器(即使使用消息作为传输模式)似乎不是一个选项,因为 WCF“WCF 强制在使用 UserName 凭据时传输是安全的。” (例如,请参阅 &lt;message&gt; element of &lt;wsHttpBinding&gt;),关于我能为您看到的唯一其他选择是使用安全令牌服务 (STS)。

最后一个选择是将服务放在专用网络上,但这可能会破坏您想要完成的任务,具体取决于您的要求。

另一个最终选择(我猜这不是最终选择)是移动到一个确实允许您使用 SSL 的托管站点。

对于 STS,您可以查看与 .NET 4.5 完全集成的 Windows Identity Foundation。如果您使用的是早期版本的 .NET,可以查看 WCF Security Token Service

【讨论】:

  • 默默无闻的安全性经常会咬人。
  • @WiktorZychla - 我同意,这就是为什么我也建议使用某种授权。
  • @Tim 我通过将 httpGetEnabled 设置为 false 为服务禁用了 de WSDL,这就是我使用 Wireshark 嗅探器得到的结果:i.imgur.com/l6TVC5g.png。蓝色矩形:我的 WCF 服务的名称,例如 /testing.svc 青色矩形:主 Url,例如:someting.com...so..anyone 可以在她/他自己的客户端中放一个 Web 引用指向something.com/testing.svc
  • @user3122306 - 我想你误解了我的意思。重读我回答的最后一句:“即使有人嗅到了您的服务地址,他们也无法拉取 WSDL 来生成代理。” 能够命中服务地址就是与能够使用服务相同。
  • 如果有人可以嗅探与服务器的数据交换,他可以编写代理来使用没有 WSDL 的服务。当然不是每个人都会这样做,但黑客可以这样做,而且要付出代价。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
相关资源
最近更新 更多