基于角色的操作授权,无需控制器

问题描述 投票:0回答:1

我正在尝试在 ASP.NET Core 8 Web API 上实现基于角色的授权,目标是默认情况下用户无权访问任何内容。他们的角色必须明确声明。

另一个要求是

Admin
角色应该有权访问所有内容。

我很难了解如何实现这个简单的网络安全要求,因为:

  1. 如果我不在控制器上添加
    [Authorize]
    属性,那么它对任何角色的任何人都完全开放。这种默认行为对我来说似乎非常奇怪,因为这意味着如果我们忘记设置
    Authorize
    属性,我们就会向任何用户完全开放我们的敏感 API。
  2. 如果我想为控制器设置“默认”角色,然后在操作级别覆盖它,我不能,因为它们是附加的。

我在这里看到了各种解决这个问题的答案,但通常它们要么回答部分问题,要么完全过时并与 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
)是不行的,因为它使我们回到缺乏安全性的情况,而且它仍然意味着所有管理员还需要拥有用户角色,这有点角色管理的开销。

我不知道如何获得这两个选项中的任何一个,我有一种感觉这意味着重新实现一些自定义的东西,但我不知道是哪些。

c# asp.net-core asp.net-core-webapi .net-8.0
1个回答
0
投票

应该是

[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"
}

您可以阅读此文档了解更多详情

© www.soinside.com 2019 - 2024. All rights reserved.