2011-09-11 67 views
3

我正在使用WCF數據服務,我有幾個字段/屬性,我想在發送回客戶端之前將其「空白」(將值設置爲空字符串或空值)。WCF Dataservice - 在返回結果之前修改對象?

例如:用戶表有密碼列,我不想將值傳遞給客戶端。這是一個例子,應用程序中還有其他這樣的列,出於安全/隱私的原因應該排除該值。

對不起,對於這樣一個基本的問題,我是新來的WCF dataservices,還沒有找到任何有前途的線索呢。我試過QueryInterceptors,但沒有運氣。

有人能指出我正確的方向嗎?

謝謝

+0

嗨,只是做一個新的查詢,只有你想讓你的客戶看到的數據 - 這應該是更容易你不覺得嗎? – Carsten

+0

@Carsten我已經嘗試過,但安全性放在客戶端以排除敏感字段。我需要服務器端的安全性來將篡改降到最低。有意義的死亡?我錯過了你想說的話嗎? – John

+0

不,我的意思是你的服務器。我之前沒有使用過Dataservice(不喜歡它太多),但是當我得到它時,你創建了一個EF模型或其他任何東西,然後公開這個對嗎?然後,只使用不包含敏感字段的模型。 – Carsten

回答

4

IMO這超出了WCF數據服務的範圍。 WCF數據服務意味着採用您的實體模型並根據訪問規則公開它。如果您的實體公開某些屬性並且該實體被公開,則其屬性只是公開的。它適用於簡單的CRUD場景或只讀場景。

QueryInterceptor不會幫助你,因爲它可以用於數據驅動的授權 - 這意味着QueryInterceptor可以添加一些附加條件來過濾其當前用戶不允許看到的記錄=它會過濾掉整個記錄,但它不會修改過濾結果。

空字段沒有掛鉤,因爲這是一個不好的方法。如果你不想暴露一些領域,他們根本不應該成爲暴露實體的一部分。您可以通過在EDMX文件中使用QueryView來創建僅公開字段的第二個只讀實體。接下來,您需要修改您的DataServiceConfiguration中的訪問規則。您必須刪除初始User實體集的訪問規則,並將讀訪問規則添加到該新實體集。

如果需要控制每個用戶的訪問規則,你必須使用某種authentication在你的服務,你必須在InitializeService方法處理這個問題(除非DataServiceConfiguration可在其他地方)。就像:

public static void InitializeService(DataServiceConfiguration config) 
{ 
    var context = ServiceSecurityContext.Current; 
    if (context != null && context.PrimaryIdentity != null) 
    { 
     var userName = context.PrimaryIdentity.Name; 
     if (SomeMethodToValidateUserPermissions(userName) 
     { 
      config.SetEntitySetAccessRule("Users", EntitySetRights.AllRead); 
     } 
    } 

    config.SetEntitySetAccessRule("TrimmedUsers", EntitySetRights.AllRead); 
} 

通過深入到WCF可以有其他方法來限制訪問某些資源,但這是最簡單的。

+0

「IMO已超出WCF數據服務的範圍,WCF數據服務旨在將您的實體模型作爲基礎,並根據訪問規則對其進行公開。」 - 意味着我甚至不能對數據進行簡單的修改,比如DateTime格式化? – Marko