【发布时间】:2020-07-30 06:01:28
【问题描述】:
我正在创建一个具有不同角色的用户的 Web API,此外,与任何其他应用程序一样,我不希望用户 A 访问用户 B 的资源。如下:
Orders/1(用户 A)
Orders/2(用户 B)
当然,我可以从请求中获取 JWT 并查询数据库以检查该用户是否拥有该订单,但这会使我的控制器操作过于繁重。
这个example 使用 AuthorizeAttribute 但它似乎太宽泛了,我必须为 API 中的所有路由添加大量条件以检查正在访问哪个路由,然后查询数据库进行几个连接,这些连接返回如果请求有效,则返回 users 表。
更新
对于路由来说,第一道防线是一个安全策略,它 需要某些声明。
我的问题是关于第二道防线 确保用户只访问他们的数据/资源。
在这种情况下是否可以采取任何标准方法?
【问题讨论】:
-
您可以使用类似“users/{userId}/orders/{orderId}”的路由并使用类似“where OwnerId = @userId and OrderId = @orderId”的SQL查询。另外添加授权过滤器检查“userId”路由参数值是否与经过身份验证的用户相同。
-
@SergeyVishnevsky 嗯,这是一个想法,但是当我可以从 httpContext 中获取 UserId 时,我最终会在每条路由中使用用户 ID,并且我将不得不添加自定义路由对于不拥有订单的管理员。我正在尝试找到一种更清洁的标准方法。
-
你到底想达到什么目的?您想允许用户只获得他的订单吗?或者您想为不同的订单创建用户角色?
-
正如我所见,基于策略的授权与多个处理程序 docs.microsoft.com/en-us/aspnet/core/security/authorization/… 可以提供帮助。您可以使用“ownerId”路由参数作为所有路由的资源所有者的指示符,并为授权要求添加两个或多个 AuthorizationHandler。第一个检查“当前用户Id等于”ownerId“路由值”,第二个检查“当前用户是admin”。如果这些处理程序之一批准了该要求,则请求被授权。
-
@OlegKyrylchuk 请查看更新后的问题
标签: c# asp.net-core-webapi asp.net-core-3.1 jwt-auth