我正在使用WCF數據服務,我有幾個字段/屬性,我想在發送回客戶端之前將其「空白」(將值設置爲空字符串或空值)。WCF Dataservice - 在返回結果之前修改對象?
例如:用戶表有密碼列,我不想將值傳遞給客戶端。這是一個例子,應用程序中還有其他這樣的列,出於安全/隱私的原因應該排除該值。
對不起,對於這樣一個基本的問題,我是新來的WCF dataservices,還沒有找到任何有前途的線索呢。我試過QueryInterceptors,但沒有運氣。
有人能指出我正確的方向嗎?
謝謝
我正在使用WCF數據服務,我有幾個字段/屬性,我想在發送回客戶端之前將其「空白」(將值設置爲空字符串或空值)。WCF Dataservice - 在返回結果之前修改對象?
例如:用戶表有密碼列,我不想將值傳遞給客戶端。這是一個例子,應用程序中還有其他這樣的列,出於安全/隱私的原因應該排除該值。
對不起,對於這樣一個基本的問題,我是新來的WCF dataservices,還沒有找到任何有前途的線索呢。我試過QueryInterceptors,但沒有運氣。
有人能指出我正確的方向嗎?
謝謝
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可以有其他方法來限制訪問某些資源,但這是最簡單的。
「IMO已超出WCF數據服務的範圍,WCF數據服務旨在將您的實體模型作爲基礎,並根據訪問規則對其進行公開。」 - 意味着我甚至不能對數據進行簡單的修改,比如DateTime格式化? – Marko
嗨,只是做一個新的查詢,只有你想讓你的客戶看到的數據 - 這應該是更容易你不覺得嗎? – Carsten
@Carsten我已經嘗試過,但安全性放在客戶端以排除敏感字段。我需要服務器端的安全性來將篡改降到最低。有意義的死亡?我錯過了你想說的話嗎? – John
不,我的意思是你的服務器。我之前沒有使用過Dataservice(不喜歡它太多),但是當我得到它時,你創建了一個EF模型或其他任何東西,然後公開這個對嗎?然後,只使用不包含敏感字段的模型。 – Carsten