我有一个构建如下的 N 层应用程序:
在 IIS7 的服务器端,有一个 ASP.Net 应用程序,它公开 WCF 服务上的方法。这些方法使用 EF4 与数据库通信。用 Silverlight 4.0 编写的客户端正在调用 WCF 服务上的方法。
WCF 服务公开了这个方法:
[OperationContract]
void DeleteItem(int i_ItemId);
我是安全 WCF 服务的新手,但我认为接下来的这些观察是正确的(如果我错了,请纠正我):
1)如果我保留此方法/服务,任何知道我的服务位于http://www.mysite.com/myservice.svc的人都可以打开 VisualStudio,打开“添加服务引用”并开始拨打电话删除项目()。
2) 如果我尝试通过删除 MEX 端点来解决上述问题,仍然可以使用一些手动编码来调用服务。
因此,为了解决这两个问题,我开始学习 WCF 中的一些内置安全功能。快速浏览后,我想我可以使用以下绑定配置,以便调用服务需要用户名和密码:
<wsHttpBinding>
<binding name="RequestUserName" >
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
尝试采用这种解决方案时,我首先想到的是:当用户登录客户端时,客户端使用用户名和密码作为 WCF 调用的凭据。在服务器端,这些凭据会根据数据库进行验证。
现在的问题是,用户当然知道这些凭据(用户名和密码),因此他可以使用它们以我已经提到的方式调用 DeleteItem()。
从这里我想出了两个解决方案:
1) 我将在客户端使用硬编码密钥,而不是使用用户名和密码作为凭据。对 XAP 中的 Dll 进行加扰可能会阻止某人获得此密钥。
2)当用户登录客户端时,服务器会发送某种临时令牌(GUID 或其他东西),客户端可以在此通信会话期间使用它来验证它的调用(假设,直到用户关闭客户端) .
我的问题是:
第一个解决方案提供的安全级别是多少?您需要付出多大的努力才能破解它?
如果第一个解决方案很难破解,WCF 中是否有内置方法来管理我在第二个解决方案中提到的令牌系统?
欢迎其他可以适应范围的解决方案。