Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.Net内核中应用粒度权限限制_C#_Security_Authentication_Asp.net Core_Authorization_Abac_Xacml_Alfa - Fatal编程技术网

C# 在ASP.Net内核中应用粒度权限限制

C# 在ASP.Net内核中应用粒度权限限制,c#,security,authentication,asp.net-core,authorization,abac,xacml,alfa,C#,Security,Authentication,Asp.net Core,Authorization,Abac,Xacml,Alfa,背景 在ASP.NETCore中应用粒度正确级别限制的最佳方法是什么。我已经设置了身份验证,我的应用程序会发出令牌,这些令牌在一定时间后过期 我的web应用程序还使用角色和权限,其中某个角色可以与一组权限相关联。我已经设定了权限并限制了对它们的访问,因为即使是管理员用户也不能更改、创建或删除任何权限(即只读)。另一方面,角色是动态的,尽管超级管理员和管理员是固定的。任何具有超级管理员访问角色的用户都有权创建新角色并为该角色分配权限 我试图做的是基于这些权限限制对应用程序中所有其他控制器的访问。

背景

在ASP.NETCore中应用粒度正确级别限制的最佳方法是什么。我已经设置了身份验证,我的应用程序会发出令牌,这些令牌在一定时间后过期

我的web应用程序还使用角色和权限,其中某个角色可以与一组权限相关联。我已经设定了权限并限制了对它们的访问,因为即使是管理员用户也不能更改、创建或删除任何权限(即只读)。另一方面,角色是动态的,尽管超级管理员和管理员是固定的。任何具有超级管理员访问角色的用户都有权创建新角色并为该角色分配权限

我试图做的是基于这些权限限制对应用程序中所有其他控制器的访问。

我正在考虑使用基于策略的授权,其中每个权限都将与特定策略关联(即
[Authorize(Policy=“delete users”)]
)。然后,我会将用户拥有的所有权利嵌入我在登录时发出的令牌中

我不愿意以这种方式实现它,因为尽管这些权限可能是硬编码的,但它们可能/将随着时间的推移而增加,如果我拥有大量的权限,那么将它们全部嵌入令牌可能会有点效率低下


是否有更好的方法来实现这种级别的安全性???

如果您需要,用您自己的话说

ASP.Net内核中的粒度权限级别限制

您需要将授权外部化,而不是在代码中构建授权。挑战在于现有框架(在.NET、Java…)为您提供了角色,有时您可以在代码中使用声明来确定用户是否应该访问给定的函数/事务/数据集

但这迫使你每次都要编写代码(在你的例子中是C语言)。当然,如果用例发生了变化,您需要重写代码。它还强制您在数据库中创建一个数据模型/信息模型,您可以在其中创建用户和角色之间的链接,也许还有一天的权限。然后,您会想知道如何处理职责分离、委派或其他您的代码和信息模型都不允许的场景

另一种方法是将您的授权外部化到将为您处理授权请求的外部化授权管理器/API。这称为ABAC(或基于属性的访问控制;)。ABAC为您提供:

  • 架构(见下文)
  • 策略语言(或)
  • 一种查询授权引擎的方法
    • 通过是/否许可/拒绝请求/响应流,例如“Alice能否查看项目123?”“是,许可”
    • 或通过开放式界面,例如“Alice可以查看什么?”“销售中的文档”
建筑 在ABAC中,您选择构建应用程序/API/解决方案的方式,使其只关注应用程序的核心业务逻辑,例如提供医疗记录

应用程序本身不会对谁可以查看哪些病历做出任何决定。您将决策委托给称为策略决策点(PDP)的外部授权引擎

要委派授权,可以使用称为策略实施点(PEP)的拦截器。该拦截器可以位于您的应用程序代码中,或者(更好的是)位于众所周知的界面前,以便它可以拦截您的事务/数据流。例如,如果您有一个API,例如
/myservice/records
,那么您会让PEP坐在API前面拦截流(JSON、XML…)

政治公众人物向PDP发送请求,例如:

  • 艾丽斯能看病历吗
  • Bob能否编辑病历#34的SSN字段
  • 卡罗尔能打印这张唱片吗

PDP根据使用属性的策略以“允许”、“拒绝”进行答复。这就引出了第二部分:政策

属性和策略 在ABAC(和XACML)中,您可以编写任意数量的策略,使用您可以想到的任意数量的属性。简单地说,属性是键值对,例如

  • role==“manager”
    (是的,角色可以是属性)
  • 出生日期=1901/04/01
  • citizensity=“德语”
    “加拿大人”
属性可以是关于用户(如上所述)或资源或操作,甚至是上下文信息,例如时间

  • 记录
    所有者
    大小
    分类
    部门
    都是资源的属性
一旦定义了属性,就可以开始定义策略了。假设用例是控制对医疗记录的访问,您可能有授权要求,例如

  • 医生可以查看分配给他们的患者的病历
  • 其他医务人员可以查看所在单位患者的病历
  • 患者可以查看自己的病历
  • 如果患者是其他患者的法定监护人,则可以查看该患者的病历
  • 如果B休假且A在B的代表名单上,A医生可以查看其他医生(B)的患者病历
  • 如果不在医院,任何人都不能查看病历
正如您所见,您可以编写任意数量的策略,并且根本不需要触碰您的应用程序。您只需编辑策略即可

它变得更好了:这种方法并不特定于ASP.NET。您可以对其他语言(Kotlin、Java…)和层(API、数据、UI…)使用相同的方法和体系结构

嗯,, 大卫

进一步阅读

这本书读得很好,但不幸的是,它不是我想要的。我最终做的是创建与cl相关的策略