.net 将授权放在服务层而不是Web API层

.net 将授权放在服务层而不是Web API层,.net,security,asp.net-web-api,asp.net-core,authorization,.net,Security,Asp.net Web Api,Asp.net Core,Authorization,我正在用.NET核心Web API构建REST API 我的控制器只是将请求转发到服务层并返回结果 [HttpPost(nameof(Create))] public async Task<Response<ProviderDTO>> Create([FromBody] ProviderDTO provider) => await providerService.CreateAsync(provider); [HttpPost(nameof(Create)

我正在用.NET核心Web API构建REST API

我的控制器只是将请求转发到服务层并返回结果

[HttpPost(nameof(Create))]
public async Task<Response<ProviderDTO>> Create([FromBody] ProviderDTO provider)
    => await providerService.CreateAsync(provider);
[HttpPost(nameof(Create))]
公共异步任务创建([FromBody]ProviderDTO provider)
=>等待providerService.CreateAsync(提供程序);
我现在在系统中需要开始实现授权

.NETCore必须实现授权,但文档主要在Web层(控制器显然位于Web层)的上下文中讨论这些方法

我的直觉告诉我,我需要在服务层本身中实现授权,而不是将此授权放在web层上

我的一些理由包括:

  • 服务层可能会被控制器以外的其他对象调用(例如,调用其他服务的服务,此时不会涉及授权)
  • 服务授权可以直接进行单元测试,而不必依赖于为服务前面的每个“层”编写的集成测试
  • 保存对数据库的多个调用——如果我需要在授权要求中授权一个文档,如果该文档通过了,那么我将不得不在稍后的服务中取出相同的文档
  • 问题一

    IPrincipal
    iaauthorizationservice
    注入我的服务并直接在其中处理授权,这是一种明智的方法吗?然后web层只需检查用户是否登录,以及一些更简单的基于策略的属性(例如,此控制器仅允许员工策略)

    问题二

    有没有人可以将我链接到任何资源(我做过研究,但在这方面没有太多)


    PS:关于拒绝服务层中的请求,我有一个异常处理中间件,可以将自定义异常转换为HTTP响应。因此,如果发生未经授权的请求,我将抛出一些未经授权的异常,这将最终导致HTTP 403。

    这完全取决于我们讨论的授权类型以及实现授权所需的工作量

    一般来说,将服务层和web层混合使用不是一个好主意,所以要将它们分开

    Web授权是一回事——这里你是说我有一个用户,他被允许访问这个端点/页面/任何东西。如果不是这样,您甚至不调用服务层就可以节省资源,并且可以在web层拒绝请求,在过程的早期和快速拒绝请求,而不会浪费资源

    接下来,您所谈论的服务层是什么?它是一个真正与数据库对话的程序,还是一个一旦从数据层获得数据就进行数据操作的程序

    我的首选是有一个单独的数据层和授权层。授权层应用您需要的任何规则,然后返回其结果,这样您就知道是否需要获取任何数据。它没有链接到您的web层,它不返回HTTP代码,一般来说,它与UI端无关

    这意味着,如果您有多个客户端,例如Web UI和移动UI,那么这两个客户端都将通过此层,这样就不会重复此级别的工作

    更好的是,您可能希望构建一个负责返回数据的适当API,然后您所要做的就是从您拥有的任何客户机处理这件事,并且您可以在那里处理您的授权。如果您确保可以单独调用授权层,而不依赖于其他任何东西,那么您可以从多个位置调用授权层,并且可以轻松独立地对其进行测试

    这是人们在构建任何东西之前要考虑的事情,一旦其他事情都完成了,安全性并不是最后添加的东西。您在构建产品时考虑到了它,因为它涉及到很多东西,并且会影响您的架构

    一张所有东西如何组合在一起的图表会有所帮助

    • 你们有什么样的建筑
    • 你所说的授权有多重要
    • 我们在谈论什么样的客户
    在这之前,有很多很多问题需要回答

    我再多说几点,你说了几句话:

    服务层可能会被控制器以外的对象调用 (例如,服务调用其他服务,这不会 与授权有关)

    服务授权可以直接进行单元测试,而不是 依靠为每个“层”编写的集成测试 在服务台前面

  • 如果您考虑的是微服务,也就是许多独立运行的小服务,那么您肯定需要关注安全性,这取决于这些服务的访问方式和相互通信方式

  • 这就是为什么你要写一个授权层,所有的东西都要经过它,这是一个你测试的层,而不关心任何UI类型的事情