C# 在ASP.NET Core 3中实现精细分级权限

C# 在ASP.NET Core 3中实现精细分级权限,c#,asp.net,asp.net-core,authorization,C#,Asp.net,Asp.net Core,Authorization,我想为我的新ASP.NET Core 3应用程序提供细粒度权限。应用程序中会有很多区域(开始时有几个区域,但每个新功能都会有另一个区域来控制访问),我怀疑,迟早我会需要精确的访问控制(例如,该用户应该能够访问员工可以访问的内容,以及区域X、Y RW和Z RO) 自己实现这样的机制很容易,但我希望使用ASP的内置机制,而不是从头开始编写所有内容。因此,根据我所读到的有关ASP.NET Core授权机制的内容,我将采用以下方式: 为用户提供声明,通过标记(例如,列表、读、写、删除、管理)控制对特定

我想为我的新ASP.NET Core 3应用程序提供细粒度权限。应用程序中会有很多区域(开始时有几个区域,但每个新功能都会有另一个区域来控制访问),我怀疑,迟早我会需要精确的访问控制(例如,该用户应该能够访问
员工
可以访问的内容,以及区域X、Y RW和Z RO)

自己实现这样的机制很容易,但我希望使用ASP的内置机制,而不是从头开始编写所有内容。因此,根据我所读到的有关ASP.NET Core授权机制的内容,我将采用以下方式:

  • 为用户提供声明,通过标记(例如,列表、读、写、删除、管理)控制对特定区域的访问
  • 创建
    IAuthorizationPolicyProvider
    的实现,它将根据传递的参数动态创建特定的策略,例如:
    [Authorize(Policy=“Area1,r”)]
    [Authorize(Policy=“Area5,a”)]
    (使用动态创建的处理程序)
  • 向依赖项注入系统注册我的自定义
    IAuthorizationPolicyProvider
老实说,这对我来说似乎有点过于工程化,因为我可以实现自己的授权属性,对于初学者来说,这将简化输入限制(在某种程度上,访问定义中的错误将在编译期间捕获,而不是在应用程序运行期间捕获):

然而,这似乎是一种避免使用ASP.NET核心机制的解决方案,因为我前面介绍的解决方案似乎是Microsoft希望我们使用策略的方式(请参阅)


TL;DR:在ASP.Net Core 3中实现这种细粒度权限的正确方法是什么?此外,按照Microsoft建议的方式实现权限的实际优势是什么?

是的,建议的方法是为此使用策略,策略(通常)检查用户声明。这对MVC和Identity很有效,因为声明是在后端检索的。对于带有Jwt令牌身份验证的WebAPI来说效果不太好,因为声明是令牌的一部分(并且允许的大报头数量有限,而且大报头会减慢请求速度,因为需要向服务器发送更多数据)
[RestrictAccess(Areas.Area1, AreaAccess.Read)]
public IActionResult MyAction() { }