2

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

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

}

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

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

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

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

请让我知道,有什么办法可以实现这一点。

4

2 回答 2

2

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

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

切勿以这种方式进行访问限制。

于 2013-06-01T07:51:58.147 回答
1

可以考虑将 DataContractSalary作为可选属性公开,例如:

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

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

于 2013-06-01T08:04:16.000 回答