【问题标题】:Filtering queries across $expands with WebApi2 OData使用 WebApi2 OData 过滤 $expands 中的查询
【发布时间】:2014-02-25 17:45:18
【问题描述】:

我有一个支持 Entity Framework 6.1 的 WebApi 2.1 OData (v 5.1.1) 服务。我试图从安全的角度将其锁定,以便用户只能查询属于他们的数据。在您使用 $expands 选项之前,我一切正常。

为了便于讨论,请考虑以下简化的数据模型:

public class Scenario
{
    public Guid Id { get; set; }
    public Guid CreatedById { get; set; }
}

public class Property
{
    public Guid Id { get; set }
    public Guid CreatedById { get; set; }
    public IQueryable<Scenario> Scenarios { get; set; }
}

当我调用/Properties(guid'SOMEGUID')?$expand=Scenarios 时,我需要能够确保只返回 CreatedById = CurrentUserId 的场景。这需要发生在服务器端而不是客户端查询中。

WCF 数据服务具有可以处理这种情况的 QueryInterceptor...WebApi 2.1 OData 中的等价物是什么?

谢谢!

【问题讨论】:

  • 所有遇到这种情况的人都知道,Javier 提到的模式有效,我们在产品中很好地实现了它。但是,github.com/OData/RESTier 是解决此问题的更全面的解决方案,可以阻止遍历攻击。

标签: asp.net-web-api odata


【解决方案1】:

这里有一个示例,说明如何自行实现此功能: https://gist.github.com/anonymous/9237151

基于我的 git,您可以使用类似的验证器并在 CanAcess 方法或类似方法上实现您的验证逻辑。如果这对您有帮助,请告诉我。

我们很快就会在http://aspnet.codeplex.com上发布官方样品

【讨论】:

  • 非常感谢您,哈维尔。 EDM 5.6.1 库中是否有与 IEdmNavigationSource 等效的内容?或者我可以只使用 IEdmNamedElement 吗?
  • Javier,您是否有办法使用这种技术来限制返回的数据,其中属性等于特定值? (相当于左外连接?)
【解决方案2】:

如果我正确理解了您的问题,有两种方法可以解决您的问题。

  1. 对 IQueryable 结果调用 ODataQueryOptions 的 ApplyTo 方法
    public IQueryable<Property> Get(ODataQueryOptions queryOptions) { .... return queryOptions.ApplyTo(properties); }

  2. 在 GetData 方法上添加属性 Queryable 并让 WebAPI 处理查询选项
    [Queryable] public IQueryable<Property> Get() { ... return properties; }

【讨论】:

  • 这不是我要找的,我已经可以获取查询并应用选项。我需要能够限制通过导航属性返回的相关数据,而 Javier 的答案是正确的。
猜你喜欢
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多