我喜欢 OData,而且我特别高兴它被 ASP.NET Web API 采用。
我创建了一些服务供内部应用程序使用,但从不供公众使用。主要原因是 OData 的开放性似乎很难让“安全”免受滥用。
最具体地说,我担心鉴于运行任意查询的能力,用户可能会表达一个复杂的查询,这会给操作系统带来压力,以至于对所有其他用户的体验都不好。
在 WebApi 控制器中,OData 端点公开如下:
public class OrderController
{
[Queryable]
public IQueryable<Orders> Get()
{
// Compose and return the IQueryable<Orders>
}
}
这可以完全控制查询的组合和执行过程,但通过复杂的IQuerable<T>
界面来实现。为用户提供信息的子集变得微不足道,例如附加 aWhere
以仅包括他们有权访问的记录。
是否有IQueryable<T>
可以包装现有IQuerable<T>
实例以限制用户可以运行的查询的实现?我最感兴趣的是限制查询的复杂性,但我也希望能够防止用户遍历与他们不应该访问的资源的关联。