使用OData FilterQueryValidator强制执行“必须包含”,“应包含”等条件

时间:2015-08-10 06:08:36

标签: c# asp.net-web-api odata

我需要检查并验证OData过滤器查询必须包含属性和值。

例如:让我们说一下传入的过滤器查询,

  • 过滤器中必须包含“RegionID”,
  • “RegionID”必须包含值5

(当然“RegionID”和值“5”需要动态更改,因此同样的过滤器可用于检查其他属性和值,甚至多个属性和多个值)

到目前为止,我一直在尝试使用自定义FilterQueryValidator来验证上述方案(如此处Security Guidance for ASP.NET Web API 2 OData所述)。但仍然无法弄清楚如何做到这一点。

所以我的问题是,

  1. 是否可以使用FilterQueryValidator
  2. 执行此操作
  3. 那么我怎么能用FilterQueryValidator做到这一点? (如果可能的话可以 你请给我一些示例代码作为起点。)
  4. 如果无法做到这一点,我该如何归档?
  5. 关于项目

    • WebAPI 2和OData v3(两者都不可更改)

    感谢。

    更新

    根据范欧阳的回答,我最终覆盖ValidateValidateSingleValuePropertyAccessNode以检查所需参数

1 个答案:

答案 0 :(得分:1)

http://blogs.msdn.com/b/webdev/archive/2013/02/06/protect-your-queryable-api-with-validation-feature-in-asp-net-web-api-odata.aspx

场景8:如何为$ skip,$ top,$ orderby,$ filter

自定义默认验证逻辑

ValidateSingleValuePropertyAccessNode方法中 通过propertyAccessNode.Property.Name检查媒体资源名称,通过binaryOperatorNode.OperatorKind

查看运营商
var binaryOperatorNode = propertyAccessNode.Source as BinaryOperatorNode

检查binaryOperatorNode.Right as ConstantNode处的右侧5。

我认为有足够的钩子和公共方法来实现这一点,代码很明确https://github.com/OData/WebApi/blob/master/OData/src/System.Web.Http.OData/OData/Query/Validators/FilterQueryValidator.cs