我正在尝试在 ASP.NET Core 8 Web API 上实现基于角色的授权,目标是默认情况下用户无权访问任何内容。他们的角色必须明确声明。
另一个要求是
Admin
角色应该有权访问所有内容。
我很难了解如何实现这个简单的网络安全要求,因为:
[Authorize]
属性,那么它对任何角色的任何人都完全开放。这种默认行为对我来说似乎非常奇怪,因为这意味着如果我们忘记设置 Authorize
属性,我们就会向任何用户完全开放我们的敏感 API。我在这里看到了各种解决这个问题的答案,但通常它们要么回答部分问题,要么完全过时并与 ASP.NET MVC 相关,或者它们涉及使内容公开/不公开。
我想要的是这个:
public class AppController : Controller
{
[Authorize(Roles = "User")]
public IActionResult ListItems() {} // <= Can be accessed by role "User"
public IActionResult GetItem() {} // <= Can be accessed by no one
}
作为替代方案,我们可以接受这个:
[Authorize("Admin")]
public class AppController : Controller
{
[Authorize(Roles = "User")]
public IActionResult ListItems() {} // <= Can be accessed by roles "User" OR "Admin"
public IActionResult GetItem() {} // <= Can be accessed by "Admin"
}
但我还没有看到任何方法来改变这样一个事实:如果控制器的角色检查失败,它将无法到达操作的检查。
反转逻辑(控制器上的用户,然后在应有的位置上
Admin
)是不行的,因为它使我们回到缺乏安全性的情况,而且它仍然意味着所有管理员还需要拥有用户角色,这有点角色管理的开销。
我不知道如何获得这两个选项中的任何一个,我有一种感觉这意味着重新实现一些自定义的东西,但我不知道是哪些。
应该是
[Authorize("Admin,User")]
public class AppController : Controller
{
public IActionResult ListItems() {} // <= Can be accessed by roles "User" OR "Admin"
[Authorize(Roles = "Admin")]
public IActionResult GetItem() {} // <= Can be accessed by "Admin"
}
您可以阅读此文档了解更多详情