3

对于基于 OData 的 Web API,我有一个额外的身份验证层,用于检查用户是否具有访问模型的适当权限。现在,当在查询中使用 $expand 时,模型的绑定完全绕过了这些授权检查。

我想要的是,当调用(例如)/odata/Countries(2)?$expand=Locations,People,并且授权层报告当前用户无权检索People时,仍然给出响应,但只有Locations绑定到Countries。因此不可访问的People模型不应与Countries.

我可以派生SelectExpandQueryValidator并修改该Validate功能。但这仅允许我声明扩展查询无效,而不是对其进行修改。更重要的是,这是一个身份验证问题,不属于验证。此外,我需要该Countries实体,以便身份验证层确定是否Locations可以People访问。

随后,我查看了 System.Web.Http.OData.Query 命名空间,发现我应该以某种方式修改RawExpand属性SelectExpandQueryOption。但由于这是只读的(而且看起来真的很像黑客),我开始寻找替代品。只是,我找不到ODataQueryOptions调用类以使用ApplyTo方法(在我的情况下绑定所有扩展模型)的时间。所以归结为:我如何修改 $expand 绑定模型的方式,而我已经在被调用的方法中?

由于这是一个非常具体的 $expand 问题,但仍然是 beta 功能,我可能正在寻找在这里徘徊的 ASP.NET Web API 开发人员。我是否在这里遗漏了一些明显的功能,或者我的要求太高了?提前致谢!

4

2 回答 2

2

我知道这个问题有点老了,但是当我遇到同样的问题时,我仍然必须处理 ODATAv3,我想我可能仍然会对此发表评论。

我们基本上不得不修改 ODataQueryOptions 的选项:

在相应的 Controller 方法中替换 ODataQueryOptions

在这里,我们可以通过创建新选项并更新方法内的引用来替换查询选项。

通过子类 EnaleQuery 属性替换 HttpActionContext.ActionArguments 中的 ODataQueryOptions

使用此选项,我们通过定义自定义 [EnableQueryAttribute] 来替换中的查询选项。ActionContext

实际实现是一个三步法:

  1. 我们首先分析和解析RequestUri内部ODataQueryOptions并抛出我们不需要或不想改变的选项。
  2. 然后我们可以从中创建一个新RequestUri的并替换原来RequestUriHttpRequestMessage...
  3. ...在最后一步中,我们创建ODataQueryOptions了与原始相关联的新内容,ODataQueryContext并且刚刚进行了更改HttpRequestMessage

动态修改 ODataQueryOptions 中的实际代码示例更详细地描述了这两种方式。

希望能帮助到你。问候,罗纳德

于 2017-02-27T07:01:17.053 回答
0

你试过使用 WebApi V4 吗?有一个关于修改过滤器的问题,我认为您也可以对 SelectExpand 执行此操作。 OData V4 在服务器端修改 $filter

于 2015-12-11T02:01:13.520 回答