使用WebApi2 OData过滤$ expand的查询

时间:2014-02-25 17:45:19

标签: asp.net-web-api odata

我在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数据服务有QueryInterceptors可以处理这种情况...... WebApi 2.1 OData中的等价物是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

这里有一个关于如何自己实现这个的样本的要点: https://gist.github.com/anonymous/9237151

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

我们很快会在http://aspnet.codeplex.com

上发布官方样本

答案 1 :(得分:-1)

如果我理解你的问题,有两种方法可以解决你的问题。

  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; }