【问题标题】:Restrict methods of a WCF service from unauthorized (unwanted) user access限制 WCF 服务的方法免受未经授权(不需要的)用户访问
【发布时间】:2011-08-29 03:11:23
【问题描述】:

我想知道如何限制未经授权的用户访问某些方法。假设我有一个具有以下合同的 WCF 服务:

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

用户应该按照以下方式行事:

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

好吧,这可能是个愚蠢的问题,但是如果客户 A 的 id 是 23,但不知何故客户 A 知道客户 B 的 id 是 42。现在客户 A 可以读取客户 B 的秘密发票数据... 我最好怎么做才能避免这种情况?

【问题讨论】:

    标签: wcf authentication authorization


    【解决方案1】:

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

    【讨论】:

    • 我知道这篇文章,但我无法为我下结论。让有 1000 个客户访问该服务。我该怎么办?也许我不够聪明,无法将其从文章中删除;)我能想象的唯一实用方法是在每个请求中发送用户名和密码,但这作为每个方法的参数。但我认为必须有更好的方法......
    【解决方案2】:

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

    因此,IMO 您需要在方法内实现用户身份验证(无需单独调用)。即您必须将用户 ID 和密码连同 invoiceid 一起传递给 GetCustomersInvoices() 方法,并且在其中您需要对用户进行身份验证并检索数据。

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

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

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

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

    一般而言,您可以通过以下链接获取有关 WCF 支持的各种安全性的更多信息,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      相关资源
      最近更新 更多