我有以下域名服务:
pulic void DeleteCustomer(int customerId, string userIdentity, string userPassword)
{
//1º Do login operation to verify if the credentials are valid.
customerRepository.DeleteById(customerId);
}
假设我正在使用具有登录窗口的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窗体应用程序将只进行一次登录操作,但任何调用者都可以传递任何requestUserId,从而留下了可怕的安全漏洞。
答案 0 :(得分:3)
虽然我完全赞同@KhanhTO的逻辑,但我会扩展它,因为这是你的服务层,除了属性,我宁愿注入一个授权服务接口,它将与登录用户进行检查,例如。查看他是否具有与其凭据相关联的正确权限以执行给定命令。
答案 1 :(得分:2)
在任何需要授权的方法中进行授权是有意义的,否则会出现安全问题,尤其是当这些方法在后端逻辑中为入口点时。这意味着如果您将这些域服务部署为可从外部访问的另一层,则这些方法确实需要保护。
从defensive programming的角度来看,每种方法都应该能够保护自己免受无效或虚假输入的侵害,这也适用于这种情况。
从REST无国籍的角度来看,每个请求都应该隔离,这意味着每个请求都应该包含所有必要的信息而不依赖于之前的请求,而甚至不应该成为服务器状态。因此,所有请求都应独立授权。
此外,授权是一个贯穿各领域的问题,您应该考虑将授权代码编写为属性。