【问题标题】:WCF Dataservice - modify object before returning results?WCF Dataservice - 在返回结果之前修改对象?
【发布时间】:2011-09-11 08:19:30
【问题描述】:

我正在使用 WCF 数据服务,并且在发送回客户端之前,我想“清空”一些字段/属性(将值设置为空字符串或 null)。

例如:用户表有密码列,我不想将值传递给客户端。这是一个示例,应用程序中还有其他此类列,出于安全/隐私原因,应排除该值。

对于这样一个基本问题,我很抱歉,我是 WCF 数据服务的新手,还没有找到任何有希望的线索。我试过 QueryInterceptors 但没有运气。

有人能指出正确的方向吗?

谢谢

【问题讨论】:

  • 您好,只需创建一个新查询,该查询仅获取您希望客户查看的数据 - 您认为这应该更容易吗?
  • @Carsten 我之前尝试过,但安全性放在客户端上以排除敏感字段。我需要服务器端的安全性以将篡改降至最低。死掉有意义吗?我错过了你想说的话吗?
  • 不,我的意思是你的服务器。我以前没有使用过 Dataservice(不太喜欢它),但是当我得到它时,您创建了一个 EF 模型或其他任何东西并公开它吗?然后只需使用不包含敏感字段的模型。
  • @John,你最后想到了什么?

标签: c# entity-framework-4 wcf-data-services


【解决方案1】:

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 数据服务旨在获取您的实体模型并根据访问规则将其公开。” - 意味着我什至不能对日期时间格式等数据进行简单的修改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多