2011-09-11 47 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