WCF服务,相同合同,但某些数据成员特定于客户端

时间:2013-06-01 07:26:48

标签: wcf

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

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

}

现在我有两位客户说HR和经理。

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

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

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

请告诉我,有什么办法可以实现这个。

2 个答案:

答案 0 :(得分:2)

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

原因:即使这是可能的,您的系统也可以作为任何恶意攻击者的蛋糕,只需要Visual Studio。根据客户类型提供机密数据(以及工资肯定是这样的数据)是在寻找麻烦。

绝不以这种方式进行访问限制。

答案 1 :(得分:1)

可以考虑让DataContract公开Salary作为可选属性, e.g:

[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?

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