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



我正在使用EF Core 3.0,我喜欢实现ABAC系统来控制应用程序中的权限。为此,我想在一层中完成所有权限工作,并使用控制器中的一些装饰器对其进行控制。这个想法是遵循这个例子。我认为使用新的UseAuthorization方法也会有所帮助。

我仍在设计解决方案,我有一个问题:目前在我的控制器中,我有以下功能(授权过滤器尚未实现,这正是我正在处理的地方(

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

我还有一些其他的返回所有项目:

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

现在,在我的第一种情况下,我的授权过滤器应该简单地根据某些属性考虑某个用户是否能够访问此项目

。 清除。但是,在第二种情况下,可能是一个用户可以看到一些项目,另一个用户可以看到一些不同的项目,我不知道我的授权过滤器应该返回什么。允许还是拒绝?如果我否认,我就会失去对接下来发生的事情的控制。

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

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

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

授权层应提供有关用户可以执行的操作的详细信息,但强制执行取决于各个组件。

您的ProjectService需要知道用户有权执行的操作并强制执行它。

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

如果您的服务之一决定通过第三方SDK访问第三方服务怎么办?,这对您的..说MyTwitterService强制执行它,而不是通用授权层。

通常,您在用户的上下文中传递(通常是用户拥有的某种"权限"(,ProjectService将决定返回哪些内容。(如果权利不足或无效,则失败(。

最新更新