【问题标题】:WCF Service, Same Contract, But Some Data member are specific to clientWCF 服务,相同的合同,但某些数据成员特定于客户端
【发布时间】:2013-06-01 07:26:48
【问题描述】:

这是场景,假设我有一个 OperationContract GetEmployeeDetails,它返回 Employee 类。

class Employee
{
  public int EmpId { get; set; }
  public string EmpName { get; set; }
  public string Salary{ get; set; }

}

现在我有两个客户,分别是 HR 和经理。

Manager 客户端创建代理时,不应暴露薪水属性。 当 HR 客户端创建代理时,salary 属性应该被暴露。

我正在使用 WCF 服务,无法实现 REST,对客户端没有任何控制。

不能使用接口来实现这一点,因为实际的实体非常复杂,有多个内部类。

请告诉我,有什么方法可以实现。

【问题讨论】:

  • 为什么不定义单独的服务合同
  • 1.服务合同级别没有变化。 2. 我可能有大约 10 个客户需要限制 DataMembers,在这种情况下,我将创建 10 个服务合同甚至更多 DataContracts。
  • 我的意思是您定义了具有适当规范的单独服务合同,您在问题中提到了什么。在客户端使用特定的服务合同

标签: wcf


【解决方案1】:

不要这样做。进行适当的身份验证/授权机制(应根据用户权限返回数据)。

原因:即使这是可能的,你的系统对于任何只有 Visual Studio 的恶意攻击者来说都是小菜一碟。根据客户类型泄露机密数据(工资当然是这样的数据)是自找麻烦。

永远不要以这种方式进行访问限制。

【讨论】:

    【解决方案2】:

    可以考虑拥有一个将Salary 公开为可选属性的DataContract, 例如:

    [DataContract]    
    public class Employee
    {
        [DataMember(IsRequired = true, Order = 0)]
        public int EmpId { get; set; }
    
        [DataMember(IsRequired = true, Order = 1)]
        public string EmpName { get; set; }
    
        [DataMember(IsRequired = false, Order = 2)]
        public decimal? Salary{ get; set; }
    }
    

    如果客户端被授权(例如,在您的情况下必须是“HR”角色),则仅返回可选属性的非空值。

    显然,这需要您对客户端进行身份验证,并具有适当的授权机制(例如 ASP.NET RoleProvider)。

    如果您的可选属性是值类型,则它应该是 Nullable 值,以便您可以将其值返回为 null - 例如在上面的示例中,我将 Salary 设为 decimal?

    使用这种方法,所有客户端都会看到数据协定,因此知道可选属性的存在(在某些情况下可能被视为安全漏洞),但只有授权客户端才能看到可选属性的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2017-04-21
      • 2011-03-04
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多