首页 > 解决方案 > 如何使用 OData 强制执行资源级别权限

问题描述

我一直在阅读有关 OData 的文档,但找不到任何有关资源级别访问控制的信息。

在 OData 示例中,人 russellwhyte 正在获取行程 1003。但是我如何验证请求者可以访问 People = 'russellwhyte' 和 Trip = 1003?如果请求者可以访问“rusellwhyte”,但将行程 1003 更改为属于另一个人的 1004,那么应该拒绝该请求,因为 1004 属于另一个人,并且因为请求者无权访问行程 1004 .

GET
serviceRoot/People('russellwhyte')/Trips(1003)

上述请求可能因三个原因被拒绝,

  1. 请求者无权访问 russelwhyte 的数据。
  2. 请求者无权访问行程 1003。
  3. 请求者将行程ID更改为无效的,1004。(1004属于另一个人)

[Route("people/{personId}/trips/{tripId}")]如果这是一个简单的路由定义(

标签: c#odata

解决方案


trips被评估时,它应该已经有过滤器personId,例如,如果tripId没有指定,那么执行的查询应该类似于这个 Linq to Entities 表达式

from p in db.People
where p.Id == personId
select p.Trips

因此,当tripId存在时,唯一的区别应该是响应在前一个查询的顶部应用了进一步的过滤器。

这样,当提供错误tripId或时personId,结果将是空对象或Http 404 , Not Found。(取决于您的实施)

您没有提到您使用的是什么中间件、OData 版本或 ORM,所以这都是猜测,在使用 ASP.Net ODataLib 的 OData v4 上,我必须在每个我想支持这种类型的嵌套导航的控制器上实现自己的逻辑,但是约定是相同的,每个导航路由级别在父路由控制器提供的查询顶部向选择查询添加了一个新条件。


推荐阅读