我正在开发一个Windows窗体应用程序,它使用由我开发的WCF服务托管在互联网付费托管上。
在我的WCF服务上,我有一些OperationContracts为Windows窗体客户端提供一些功能。 如果我在Windows窗体客户端中设置指向我的WCF服务的新服务引用,我可以使用该OperationContracts。这里没问题。
如果某人'知道'我的WCF服务的地址,任何人都可以在他/她自己的'客户端应用程序中使用我自己的'WCF服务。
使用类似Wireshark的工具,检索WCF服务网址非常简单。
所以,我的问题......有什么保护可以避免这种情况? 我不希望“其他客户”使用我自己的WCF服务。
PS:无法在付费托管上使用SSL证书。
答案 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但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。