c# - 在ASP.Net核心中应用粒度权限限制

标签 c# security authentication asp.net-core authorization

背景

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

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

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

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

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

有没有更好的方法来达到此安全级别???

最佳答案

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


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


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

但这迫使您每次都编写该代码(在您的情况下为C#)。而且,当然,如果用例发生变化,则需要重写代码。它还会迫使您在数据库中创建数据模型/信息模型,并在其中创建用户和角色之间的链接,并可能需要一天的权限。然后,您最终想知道如何处理您的代码或信息模型都不允许的职责分离或委派或其他情况。

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


体系结构(请参见下文)
策略语言(
查询授权引擎的方法


通过是/否许可/拒绝请求/响应流,例如“爱丽丝可以查看项目#123吗?” “是的,请允许”
或通过开放式界面,例如“爱丽丝可以看什么?” “销售文件”



架构

在ABAC中,您选择以仅关注应用程序核心业务逻辑的方式构建应用程序/ API /解决方案。提供医疗记录。

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

要委派授权,请使用称为策略执行点(PEP)的拦截器。该拦截器可以位于您的应用程序代码内,或者-更好的是-位于知名接口的前面,以便可以拦截您的事务/数据流。例如,如果您有API,例如/myservice/records,那么您将让PEP坐在API的前面,以拦截流(JSON,XML ...)

PEP向PDP发送请求,例如:


爱丽丝可以查看#123医疗记录吗?
鲍勃可以编辑34号医疗记录的SSN字段吗?
卡罗尔可以打印记录123吗?


The ABAC Architecture

PDP根据使用属性的策略答复“允许,拒绝”。这将我们带到第二部分:政策。

属性和政策

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


role=="manager"(是的,角色可以是属性)。
dateOfBirth = 1901/04/01
citizenship = "German""Canadian"


属性可以是关于用户(如上所述),资源或操作甚至是上下文信息的信息,例如时间。


记录ownersizeclassificationdepartment都是资源的属性。


定义属性后,就可以开始定义策略了。假设用例用于控制对医疗记录的访问,则您可能具有授权要求,例如


医生可以查看分配给他们的患者的病历。
其他医务人员可以查看其所在单位患者的病历。
病人可以查看自己的病历
如果患者是该患者的法定监护人,则可以查看该患者的病历。
如果B正在休假并且A在B的代表列表中,则A医生可以查看另一位医生(B)的患者的病历。
如果他们不在医院,则没有人可以查看病历。


如您所见,您可以编写任意数量的策略,而根本不需要触摸应用程序。您需要做的就是编辑策略。

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

HTH,
大卫。

进一步阅读


Benefits of ABAC
ABAC on Wikipedia
XACML on Wikipedia

关于c# - 在ASP.Net核心中应用粒度权限限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49917039/

相关文章:

c# - 如何在代码中触发点击事件

spring - requestmap 类型导致登录/身份验证无限重定向

wordpress - 无需身份验证即可使用 WP-REST 获取帖子

authentication - SSH 端口隧道授权

c# - 在 C# 中向 URL 添加句号

c# - 如何安装 OxyPlot NuGet 包?

c# - 帮我命名这个属性 (C#)

使用 MySql 的 Android 应用程序,安全吗?

security - 如何从 Mac 上的 Chrome 导出证书?

java - 通过授权限制对 Play Framework 中方法的访问 - Java