我喜欢 OData,我特别高兴它被 ASP.NET Web API 采用。
我创建了一些供内部应用程序使用的服务,但从未供公众使用。主要原因是 OData 的开放性似乎使其很难“安全”地防止滥用。
最具体地说,我担心鉴于运行任意查询的能力,用户可能会表达复杂的查询,这会给操作系统带来压力,以至于对所有其他用户的体验都不好。
在 WebApi Controller 中,OData 端点公开如下:
public class OrderController
{
[Queryable]
public IQueryable<Orders> Get()
{
// Compose and return the IQueryable<Orders>
}
}
这可以完全控制查询的组合和执行过程,但通过复杂的 IQuerable<T>
实现界面。这使得向用户提供信息的子集变得微不足道,例如附加一个 Where
仅包含他们有权访问的记录。
有没有IQueryable<T>
可以包装现有 IQuerable<T>
的实现实例来限制用户可以运行的查询?我最感兴趣的是限制查询的复杂性,但我也希望能够阻止用户遍历与他们不应访问的资源的关联。
最佳答案
我想您会很高兴了解到在 RTM 中,我们添加了一些选项来让您自定义要向用户公开的查询类型。所以你可以这样做,例如:
[Queryable(
AllowedFunctions = AllowedFunctions.AllStringFunctions,
AllowedLogicalOperators = AllowedLogicalOperators.Equal,
AllowedOrderByProperties = "ID")]
并以几种常见的方式限制您的查询。如果您想进一步限制查询,可以插入验证 Hook ,例如 ODataQueryValidator
或通过重写 [Queryable]< 上的
属性。ValidateQuery
方法
您可以使用我们的夜间构建来访问这些功能,或者自己构建最新的部分。
关于asp.net-web-api - 如何加强 ASP.NET WebApi OData 服务以防止滥用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14316072/