未经授权时修改$expand函数的绑定

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开发人员。我是否错过了一些明显的功能,还是我的需求太高了?先感谢您!

嗨,你是否找到了一个好的方式来做这件事?我现在也正在尝试实现同样的事情。 - pharophy
很不幸,我没有。在WebAPI首次发布RTM之前不久,我正在开发的项目被废弃了,所以我从未有机会看到这是否在以后得到解决。如果有人能够在最新的WebAPI版本中解决这个问题,我仍然想知道如何解决。 - Kazu
2个回答

2
我知道这个问题有点老了,但是当我遇到同样的问题时,仍然需要处理ODATAv3,所以我想我可能还是可以对此发表评论。基本上,我们有两种选项来修改ODataQueryOptions:
1. 在相应的Controller方法内部替换ODataQueryOptions
在这里,我们可以通过创建新的查询选项并更新方法内的引用来替换查询选项。
2. 通过子类化EnaleQuery属性在HttpActionContext.ActionArguments中替换ODataQueryOptions
使用此选项,我们可以通过定义自定义[EnableQueryAttribute]来在ActionContext内部替换查询选项。
实际实现是一个三步骤的过程:
1. 我们首先分析和解析ODataQueryOptions中的RequestUri,并且排除我们不需要或不想更改的选项。
2. 然后我们可以从中创建一个新的RequestUri,并将原始的RequestUri替换为HttpRequestMessage...
3. ...并且在最后一步,我们会创建与原始ODataQueryContext相关联且刚刚更改的HttpRequestMessage的新ODataQueryOptions。
这两种方法都在动态修改ODataQueryOptions中进行了更详细的描述,其中包含实际代码示例。希望能帮助您。敬礼,Ronald

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接