我应该对我的域服务进行授权吗?

Should i do authorization on my Domain Services?

我有以下域服务:

pulic void DeleteCustomer(int customerId, string userIdentity, string userPassword)
{
    //1º Do login operation to verify if the credentials are valid.

    customerRepository.DeleteById(customerId);
}

假设我正在使用具有登录 window.

的 ASP.NET MVC 或 Windows Forms 应用程序的代码

每次操作都会重新验证登录,浪费资源。

假设我将其更改为:

pulic void DeleteCustomer (int customerId, int requestUserId)
{
    //1º Trust that requestUserId is valid.

    //Do something with the requestUserId (e.g Set the UserId that deleted the customer)

    customerRepository.DeleteById(customerId);
}

在这种情况下,登录操作将由 ASP.NET MVC 或 Windows Forms 应用程序执行一次,但任何调用者都可以传递任何 requestUserId,从而留下一个可怕的安全漏洞。

在任何需要授权的方法中进行授权是有意义的,否则会出现安全问题,尤其是当这些方法是后端逻辑中的入口点 时。这意味着如果您将这些域服务部署为可从外部访问的另一层,这些方法 确实需要 保护。

defensive programming 的角度来看,每个方法都应该能够保护自己免受无效或虚假输入的影响,这在这种情况下也适用。

REST无状态的角度来看,每个请求都应该彼此隔离,这意味着每个请求都应该携带所有必要的信息而不依赖于以前的请求并且甚至不应该有服务器状态。因此,所有请求都应独立授权。

此外,授权是一个横切关注点,你应该考虑把你的授权码写成一个属性。

虽然我完全同意@KhanhTO 的逻辑,但我会对此进行扩展,因为这是您的服务层,而不是属性,我宁愿注入一个授权服务接口,该接口将使用记录的日志进行检查在用户中,例如。查看他是否具有与其凭据关联的正确权限以执行给定命令。