c# - 如何使用 OData 强制执行资源级别权限
问题描述
我一直在阅读有关 OData 的文档,但找不到任何有关资源级别访问控制的信息。
在 OData 示例中,人 russellwhyte 正在获取行程 1003。但是我如何验证请求者可以访问 People = 'russellwhyte' 和 Trip = 1003?如果请求者可以访问“rusellwhyte”,但将行程 1003 更改为属于另一个人的 1004,那么应该拒绝该请求,因为 1004 属于另一个人,并且因为请求者无权访问行程 1004 .
GET
serviceRoot/People('russellwhyte')/Trips(1003)
上述请求可能因三个原因被拒绝,
- 请求者无权访问 russelwhyte 的数据。
- 请求者无权访问行程 1003。
- 请求者将行程ID更改为无效的,1004。(1004属于另一个人)
[Route("people/{personId}/trips/{tripId}")]
如果这是一个简单的路由定义(
解决方案
当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 上,我必须在每个我想支持这种类型的嵌套导航的控制器上实现自己的逻辑,但是约定是相同的,每个导航路由级别在父路由控制器提供的查询顶部向选择查询添加了一个新条件。
推荐阅读
- node.js - 使用 Node.js Sharp 将 JPG 转换为 Webp
- ethereum - 当我想部署 giveth.yo 时 Netlify 出错
- flutter - 避免旋转重置为零
- python - 如何使用列名作为 csv 文件路径的一部分创建 Dataframe?
- node.js - 如何使用 graphql-compose 创建重用解析器
- firebase-cloud-messaging - 如何使用 FCM 旧版 HTTP API 正确设置 collapse_key?
- python - 处理关闭对象内的串行端口的最佳方法
- django - 匹配的查询不存在。不存在于 /blog/postComment
- javascript - 在javascript中合并2个不同数据集的最佳方法?
- excel - 使用 VBA 在单元格中排列值