2013-06-01 59 views
2

這是場景,假設我有一個OperationContract GetEmployeeDetails,它返回Employee類。WCF服務,相同合同,但某些數據成員特定於客戶端

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

} 

現在我有兩個客戶說人力資源和經理。

當Manager客戶端創建代理時,不應公開salary屬性。 當HR客戶端創建代理時,應該暴露工資屬性。

我正在使用WCF服務,不能實現REST,沒有任何控制在客戶端。

無法使用接口來實現這一點,因爲實際的實體非常複雜,具有多個內部類。

請讓我知道,有什麼辦法可以實現這一點。

+0

爲什麼不定義單獨的服務合同 – dreamweiver

+0

1.服務合同級別沒有變化。 2.我可能有大約10個客戶,我需要限制DataMembers,在這種情況下,我將創建10個服務合同和更多的DataContracts。 –

+0

我的意思是,你定義了單獨的服務合同,並在你的問題中提到了適當的規範。在客戶端使用特定的服務合同 – dreamweiver

回答

2

不要這樣做。做一個適當的認證/授權機制(數據應根據用戶權利返回)。

原因:即使這是可能的,您的系統將成爲任何惡意攻擊者的小蛋糕,只要Visual Studio在手中。基於客戶端類型提供機密數據(和工資肯定就是這樣的數據)正在招惹麻煩。

絕對不要以這種方式進行訪問限制。

1

可以考慮具有露出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; } 
} 

那麼只有當客戶端被授權爲可選屬性返回一個非空值(例如必須在你的案例中擔任「人力資源」角色)。

很顯然,這需要您驗證您的客戶端,並具有授權機制(例如,ASP.NET RoleProvider)。

如果您的可選屬性是值類型,它應該是Nullable值,以便您可以將其值返回爲null - 例如,在上面的例子中,我將薪水設爲decimal?

使用這種方法,所有客戶端都會看到數據契約,因此知道可選屬性(在某些情況下可能被視爲安全弱點)的存在,但只有授權客戶端纔會看到可選屬性的值。

相關問題