授权:在 EF Core 3.0 中使用 ABAC 在控制器中进行过滤

Authorizations: filtering in the controller using ABAC in EF Core 3.0

我使用的是 EF Core 3.0,我想实现一个 ABAC 系统来控制我的应用程序中的权限。为此,我想在一层中完成所有权限操作,并使用控制器中的一些装饰器来控制它。这个想法是遵循一点this example. I think using the new UseAuthorization method也会有帮助。

我仍在设计解决方案,但我遇到了一个问题:目前在我的控制器中,我有一些功能,例如(AuthorisationFilter 尚未实现,这正是我正在处理的地方)

        // GET api/project/:id
        [HttpGet("{projectId}")]
        [AuthorisationFilter]
        public async Task<ProjectDTO> GetProjectById(int projectId)
        {
            return await this.projectService.GetProject(projectId);
        }

我还有一些其他 return 所有项目:

        // GET api/project/projects
        [HttpGet("projects")]
        [AuthorisationFilter]
        public async Task<IEnumerable<ProjectDTO>> GetAllProjects()
        {
            return await this.projectService.GetAllProjects();
        }

现在,在我的第一个案例中,我的授权过滤器应该简单地根据一些属性来考虑某个用户是否能够访问这个项目。清除。

但是,在第二种情况下,可能是一个用户可以看到一些个项目,而另一个用户可以看到一些不同的项目,我不知道具体是什么我的授权过滤器应该 return。允许还是拒绝?如果我拒绝,我将无法控制接下来会发生什么。

我知道授权过滤器不是创建条件以生成 SQL 查询的地方,但我也不喜欢简单地接受操作并失去对权限的控制。换句话说:如果 GetAllProjects 的实施存在一个错误,比授权的项目多 return,我不应该将这些项目发送给用户。

因此:授权层应该如何工作?我应该在那里过滤有效的 projectId,然后使用此列表作为参数调用 GetAllProjects 吗?

简而言之:有没有办法将所有权限控制放在一个层中?

授权层应提供有关用户可以做什么的详细信息,但具体执行取决于各个组件。

您的 ProjectService 需要知道用户有权做什么并强制执行。

如果您的授权层做出这样的决定,它可能会非常深入地参与您的应用程序所做的几乎所有事情,因为它需要了解太多关于每个控制器操作或数据库访问的信息,或者其他任何不会很了解的信息可维护。

如果您的一项服务决定通过第 3 方 SDK 访问第 3 方服务怎么办?您的..说 MyTwitterService 强制执行该服务而不是通用授权层是有意义的。

通常你传入用户的上下文(通常是用户拥有的某种 "rights"),ProjectService 将决定要 return 的内容。 (或如果权限不足或无效则失败)。