ASP.NETWebAPI OData-消费者可以自由地查询任何他们想要的内容和方式?

ASP.NETWebAPI OData-消费者可以自由地查询任何他们想要的内容和方式?,odata,asp.net-web-api,Odata,Asp.net Web Api,我刚刚阅读了有关ASP.Net Web API对OData查询的支持的文章,我在协调查询筛选的外部暴露方面遇到了困难,这基本上为集成商提供了在数据库中抛出任意查询筛选器的能力,而不考虑最佳查询计划,不应该查询的字段等等 如何清理OData查询,以便用户不能直接向数据库抛出可怕的复杂查询,这可能会导致性能问题,并且可能包含对不应针对其执行的字段的引用?Web API具有特殊的处理机制。所以您可以检查和处理来自用户的查询 但对于OData查询,从数据库公开IQueryable并不常见。常用的方法是

我刚刚阅读了有关ASP.Net Web API对OData查询的支持的文章,我在协调查询筛选的外部暴露方面遇到了困难,这基本上为集成商提供了在数据库中抛出任意查询筛选器的能力,而不考虑最佳查询计划,不应该查询的字段等等


如何清理OData查询,以便用户不能直接向数据库抛出可怕的复杂查询,这可能会导致性能问题,并且可能包含对不应针对其执行的字段的引用?

Web API具有特殊的处理机制。所以您可以检查和处理来自用户的查询

但对于OData查询,从数据库公开IQueryable并不常见。常用的方法是在服务器上进行常规查询,“预查询”,然后让用户能够查询或过滤预查询的结果。然后,您将确信用户不能使查询比预查询的结果“更宽”

值得注意的是:WebAPI只支持filter、top、skip和orderby。所以非常有限。对于普通OData支持-使用WCF数据服务


当您想隐藏用户筛选/查询某些列时,一种方法是编写自定义处理程序,该处理程序将解析用户的URI并返回例如403错误,或者作为一种变体,使DTOs对象不包含这些列,并将它们公开给用户进行“预查询”。

Web API具有特殊的处理程序机制。所以您可以检查和处理来自用户的查询

但对于OData查询,从数据库公开IQueryable并不常见。常用的方法是在服务器上进行常规查询,“预查询”,然后让用户能够查询或过滤预查询的结果。然后,您将确信用户不能使查询比预查询的结果“更宽”

值得注意的是:WebAPI只支持filter、top、skip和orderby。所以非常有限。对于普通OData支持-使用WCF数据服务


当您想隐藏用户筛选/查询某些列时,一种方法是编写自定义处理程序,从用户处解析URI并返回例如403错误,或者作为一种变体,使DTOs对象不包含这些列,并将它们公开给用户进行“预查询”。

在我看来,这是使用OData查询语法的架构权衡。如果您不希望人们拥有无约束的查询访问权限,请不要使用它。SQL视图和SQL存储过程参数是一样的。

在我看来,这是使用OData查询语法的一种架构权衡。如果您不希望人们拥有无约束的查询访问权限,请不要使用它。SQL视图和SQL存储过程参数是一样的。

我们正在考虑解决这些问题。从Web API RC开始,我们要求您使用
[Queryable]
显式注释您的方法,以表明您希望选择自动过滤行为。我们还将研究其他一些可扩展性/定制API,这些API将在以后提供


从根本上说,由于这是一个自动系统,因此开发人员需要了解所有性能/安全注意事项。从某种意义上讲,这与参数模型绑定中的过度封装问题没有什么不同(例如,有人发布了一个IsAdmin属性设置为true的用户对象,尽管您的API从未记录过它支持这样的属性。它恰好起作用,因为您在服务器上使用的模型类型也具有IsAdmin属性)。可以通过将特定的数据写入对象来解决这些问题,这些对象严格控制您公开和接受哪些数据作为输入。

我们正在考虑解决这些问题。从Web API RC开始,我们要求您使用
[Queryable]
显式注释您的方法,以表明您希望选择自动过滤行为。我们还将研究其他一些可扩展性/定制API,这些API将在以后提供


从根本上说,由于这是一个自动系统,因此开发人员需要了解所有性能/安全注意事项。从某种意义上讲,这与参数模型绑定中的过度封装问题没有什么不同(例如,有人发布了一个IsAdmin属性设置为true的用户对象,尽管您的API从未记录过它支持这样的属性。它恰好起作用,因为您在服务器上使用的模型类型也具有IsAdmin属性)。可以通过将特定的数据写入对象来解决这些问题,这些对象严格控制您公开和接受哪些数据作为输入。

是的,但是如何防止(比如)一个特定的列首先被查询?e、 g.
$filter=SecureField eq'foo'
正常,似乎没有完全理解。不止一种方法是编写自定义处理程序,该处理程序将解析来自用户的URI并返回例如403错误。或者作为一种变体,使DTOs对象不包含这些列,并向用户DTOs对象公开“预查询”,但我如何防止(比如)首先查询特定列?e、 g.
$filter=SecureField eq'foo'
正常,似乎没有完全理解。不止一种方法是编写自定义处理程序,该处理程序将解析来自用户的URI并返回例如403错误。或者作为一种变体,使DTOs对象没有这些列,并向用户DTOs对象公开“预查询”,这是一种奇怪的折衷,因为错误的查询可能会给数据库带来潜在的负载。DBA花费大量时间构建高效的查询策略是有原因的…@NathanRidley Sure,这就是为什么他们公开存储的过程而不是无限制的查询访问。我说,通过公开“预先咀嚼”的查询资源,对您的API做同样的事情。向系统中添加新资源应该是非常便宜和容易的。考虑到坏查询可能给数据库带来的潜在负载,这似乎是一种奇怪的权衡