如何避免使用来自未知客户端的WCF服务

时间:2014-01-11 20:14:17

标签: c# wcf web-services

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

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

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

使用类似Wireshark的工具,检索WCF服务网址非常简单。

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

PS:无法在付费托管上使用SSL证书。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

修改

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

由于您无法在托管站点上使用SSL证书,因此自定义用户名验证程序(甚至使用邮件作为传输模式)似乎不是一个选项,因为WCF“WCF强制使用UserName凭据时传输是安全的“。 (请参阅<message> element of <wsHttpBinding>),关于我能看到的唯一其他选项是使用安全令牌服务(STS)。

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

另一个最终选项(我认为这不是最终选项)将转移到 允许您使用SSL的托管网站。

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