我正在使用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