Asp.net web api 如何强化ASP.NET WebApi OData服务以防止滥用?

Asp.net web api 如何强化ASP.NET WebApi OData服务以防止滥用?,asp.net-web-api,odata,Asp.net Web Api,Odata,我喜欢OData,特别高兴它被ASP.NET Web API采用 我创建了一些服务供内部应用程序使用,但从未供公共使用。主要原因是,OData的开放性似乎使其很难“安全”防止滥用 最具体地说,我担心的是,由于具有运行任意查询的能力,用户可能会表达一个复杂的查询,这会对操作系统造成压力,以至于对所有其他用户都不好 在WebApi控制器中,OData端点的公开方式如下: 公共类OrderController { [可查询] 公共IQueryable Get() { //编写并返回IQueryable

我喜欢OData,特别高兴它被ASP.NET Web API采用

我创建了一些服务供内部应用程序使用,但从未供公共使用。主要原因是,OData的开放性似乎使其很难“安全”防止滥用

最具体地说,我担心的是,由于具有运行任意查询的能力,用户可能会表达一个复杂的查询,这会对操作系统造成压力,以至于对所有其他用户都不好

在WebApi控制器中,OData端点的公开方式如下:

公共类OrderController
{
[可查询]
公共IQueryable Get()
{
//编写并返回IQueryable
}
}
这可以完全控制组合和执行查询的过程,但是可以通过复杂的
IQuerable
接口来实现。这使得向用户提供信息的子集变得很简单,例如,在其中添加一个
,只包括他们有权访问的记录


是否有一个
IQueryable
实现可以包装一个现有的
IQueryable
实例,以限制用户可以运行的查询?我最感兴趣的是限制查询的复杂性,但我也希望能够防止用户遍历他们不应该访问的资源的关联。

您不能使用此属性,而是手动接受ODataQueryOptions参数,而不是使用Queryable属性(您缺少该属性),这使您可以访问各种过滤器、顶部等选项,以允许对其进行验证

OData查询调用的任何函数都可以传递参数ODataQueryOptions,如:

public IQueryable<T> Get(ODataQueryOptions options)`  
{ 
//Use the following vars to fetch the values, and check if
//they are as you expect them to be. etc.  
options.Top.RawValue;
options.Filter.Value;
options.Filter.ApplyTo();
}
publicIQueryable获取(ODataQueryOptions选项)`
{ 
//使用以下变量获取值,并检查
//他们和你期望的一样。
options.Top.RawValue;
options.Filter.Value;
options.Filter.ApplyTo();
}

在这种情况下,您可以跳过[Queryable]属性,并使用
ApplyTo
对结果手动应用各种查询:

我想您会很高兴了解到,在RTM中,我们添加了一些选项,让您可以自定义要向用户公开的查询类型。因此,您可以这样做,例如:

[Queryable(
AllowedFunctions=AllowedFunctions.AllStringFunctions,
AllowedLogicalOperators=AllowedLogicalOperators.Equal,
AllowedOrderByProperties=“ID”)]
并以几种常见的方式限制您的查询。如果您想进一步限制查询,可以插入一些验证钩子,如
ODataQueryValidator
或覆盖
[Queryable]
属性上的
ValidateQuery
方法


您可以使用我们的夜间构建来访问这些功能,也可以自己构建最新的位。

适当地注意到缺少的属性。我已将其添加到问题中。您能否提供一个使用
ODataQueryOptions
参数产生任何效果的示例?有关想法,请参阅“下拉到ODataQueryOptions”部分。正如您在示例中所看到的,您仍然可以通过执行“大致相当于”来正常处理查询,但只需在此之前添加对ODataQueryOptions的验证。@Tragedian:我已经更新了答案,请查看如何使用此
选项
手动检查查询是否被滥用。