我正在使用WCF数据服务,我有一些字段/属性,我想在发送回客户端之前将其“空白”(将值设置为空字符串或null)。
例如:用户表有密码列,我不想将值传递给客户端。这是一个示例,应用程序中还有其他此类列,出于安全/隐私原因,应排除该值。
很抱歉这样一个基本问题,我是WCF数据服务的新手,还没有找到任何有希望的线索。我已经尝试过QueryInterceptors,但没有运气。
有人能指出我正确的方向吗?
由于
答案 0 :(得分: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,可以有其他方法来限制对某些资源的访问,但这个方法最简单。