这就是场景,假设我有一个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实现这一点,因为实际的实体非常复杂,有多个内部类。
请告诉我,有什么办法可以实现这个。
答案 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?
。
使用这种方法,所有客户端都会看到数据协定,因此知道可选属性的存在(在某些情况下可能会被视为安全漏洞),但只有授权客户端才会看到可选属性的值。