限制WCF服务的方法以防止未经授权(不需要的)用户访问

时间:2011-05-19 18:39:55

标签: wcf authentication authorization

我想知道如何限制某些方法来防止未经授权的用户访问。假设我有一个WCF服务,其中包含以下合同:

int Login(string username, string password);
Invoice[] GetCustomersInvoices(int customerId);

用户应按以下方式行事:

  1. 登录以验证服务并获取他的custumerId
  2. 通过使用customerId
  3. 调用相应的方法获取发票

    嗯,这可能是一个愚蠢的问题,但是如果customerA的id是23,但是不知何故,customerA知道customerB的id,即42.现在customerA可以读取customerB的秘密发票数据...... 我最好怎样做才能避免这种情况?

2 个答案:

答案 0 :(得分:1)

您不应该使用单个ID来识别某人。有很多方法可以在WCF中启用authn / authz,我喜欢http://msdn.microsoft.com/en-us/magazine/cc948343.aspx上的文章,对某些方法做了很好的介绍。

答案 1 :(得分:1)

您当前的调用方法只有在您能够使用SSL或任何其他此类模式在客户端和服务器之间实现安全(持久)通道时才会起作用(典型情况是烘焙付款方式)

所以IMO你需要在方法中实现你的用户身份验证(没有单独的调用)。即你必须将userid和密码以及invoiceid传递给GetCustomersInvoices()方法,并且在其中你需要对用户进行身份验证并检索数据。

以下是这种情况的解决方案,

  1. 实施您自己的用户名密码验证(custom usernameathentication),它将首先对用户进行身份验证,然后调用给定的方法。由于这将在一个请求中发生,因此它将解决您的问题。    典型的服务方法调用就像,

     Service.UserName = "abc"
     Service.Password = "***"
     Service.GetInvoiceDetails(1233)
    
  2. 您可以使用Message Headers和Body来传递自定义值,Webservices支持这样的场景,您可以在SOAP头中传递加密数据。

  3. 或者您也可以使用证书,但这些证书不是免费的。

  4. 通常,您可以通过以下链接获取有关WCF支持的各种安全性的更多信息,

    http://msdn.microsoft.com/en-us/library/ms731925.aspx