我想知道如何限制某些方法来防止未经授权的用户访问。假设我有一个WCF服务,其中包含以下合同:
int Login(string username, string password);
Invoice[] GetCustomersInvoices(int customerId);
用户应按以下方式行事:
嗯,这可能是一个愚蠢的问题,但是如果customerA的id是23,但是不知何故,customerA知道customerB的id,即42.现在customerA可以读取customerB的秘密发票数据...... 我最好怎样做才能避免这种情况?
答案 0 :(得分:1)
您不应该使用单个ID来识别某人。有很多方法可以在WCF中启用authn / authz,我喜欢http://msdn.microsoft.com/en-us/magazine/cc948343.aspx上的文章,对某些方法做了很好的介绍。
答案 1 :(得分:1)
您当前的调用方法只有在您能够使用SSL或任何其他此类模式在客户端和服务器之间实现安全(持久)通道时才会起作用(典型情况是烘焙付款方式)
所以IMO你需要在方法中实现你的用户身份验证(没有单独的调用)。即你必须将userid和密码以及invoiceid传递给GetCustomersInvoices()方法,并且在其中你需要对用户进行身份验证并检索数据。
以下是这种情况的解决方案,
实施您自己的用户名密码验证(custom usernameathentication),它将首先对用户进行身份验证,然后调用给定的方法。由于这将在一个请求中发生,因此它将解决您的问题。 典型的服务方法调用就像,
Service.UserName = "abc"
Service.Password = "***"
Service.GetInvoiceDetails(1233)
您可以使用Message Headers和Body来传递自定义值,Webservices支持这样的场景,您可以在SOAP头中传递加密数据。
或者您也可以使用证书,但这些证书不是免费的。
通常,您可以通过以下链接获取有关WCF支持的各种安全性的更多信息,