对于基于 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 开发人员。我是否在这里遗漏了一些明显的功能,或者我的要求太高了?提前致谢!