asp.net-web-api - 如何加强 ASP.NET WebApi OData 服务以防止滥用?

标签 asp.net-web-api odata

我喜欢 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/

相关文章:

c# - 如何确保线程安全的 Web API 基础 Controller 方法

javascript - jquery数据表不显示json数组数据的任何记录

javascript - 如何将 oData 中的日期转换为 JavaScript 中的日期?

c# - 无法使用 AsyncEntitySetController 为单个 OData 实体获取 $expand

c# - 是否可以在不首先执行查询的情况下更新 WCF 数据服务 (oData) 实体?

asp.net-web-api - 如何返回与在 OData 中运行查询的对象不同的对象?

javascript - 无法查看可观察对象上的数据

c# - 删除时出现 WebAPI 405 错误

c# - 从 WCF 数据服务客户端获取单个记录的最佳实践

odata - 计算 Dynamics CRM Online web api (ODATA) 中的所有行