asp.net-mvc - 常见的地方 MVC .NET 中的授权规则最佳实践

标签 asp.net-mvc controller authorization

我目前面临的情况是,我正在使用特定的授权属性来装饰我的 HttpPost Controller 操作方法,并在我的 HttpGet 中指定相同的规则,以确保某些功能在我的 View 中不可用。

是否有最佳实践或更好的解决方案,以便我可以在一个地方指定实际的业务规则以启用 DRY,并且不会陷入代码爆炸的情况,即为每个规则都有一个特定的 Authorize 属性..

我目前的情况是这样的:

public class MyController
{

   [HttpGet]
   public ActionResult List()
   {
       // This action is responsible for showing the list of records.  Each record
       // can potentially have a delete link but this is only shown for Administrators

       var viewModel = new MyViewModel()
       {
          CanDeleteRecordRole = Role.Administrator, // Duplicated rule here
          // other properties
       }
   }

   [HttpPost]
   [Authorize(Role.Administrator)]
   public ActionResult Delete(int id)
   {
      /// do stuff
   }
}

public class Role
{
   public const string Administrator = "Administrator";
}

然后在我看来,使用扩展方法我会使用 CanDeleteRecordRole,例如:

@if(Model.DisplayIfAuthorized(Model.CanDeleteRecordRole))
{
   <th>Delete record</th>
}

// and for td columns

@if(Model.DisplayIfAuthorized(Model.CanDeleteRecordRole))
{
   <td>My action link here for deletion</td>
}

最佳答案

是的,肯定有一种方法可以将业务逻辑与授权逻辑解耦并进行 DRY。该区域称为外部化授权管理 (EAM)(请参阅 Gartner's definition)。

要实现 EAM,您需要使用的不仅仅是角色。您需要使用属性,其中属性本质上只是一个键值对,例如citizenship=加拿大clearance=SECRETdepartment=sales...

角色还不够。引用article之前在评论中分享过:

What’s Wrong With Role-Based Authorization Checks?

Plenty of authorization systems have been created with role-based checks, so what’s wrong with them? A lot of things, including documentation and coupling, modeling and encapsulation issues, and requirements growth and change.

基于角色的授权(也称为基于角色的访问控制或 RBAC )不够灵活,无法表达丰富的授权场景。您需要求助于ABAC,即Attribute-Based Access Control NIST 定义的模型。

使用 ABAC,您可以轻松实现以下规则:

  • 用户可以编辑他/她拥有的文档
  • 用户可以查看属于同一部门的所有文档
  • 如果文档是草稿且文档敏感度等于或低于用户的许可,则具有审阅者角色的用户可以批准该文档。

您可以在 ABAC 中表达的内容没有限制。

可用于实现 ABAC 的事实上的标准和技术是 XACML,eXtensible Access Control Markup Language 。 XACML 定义:

  • 具有以下概念的授权架构
    • 达成决策的外部政策决策点 (PDP)
    • 策略执行点 (PEP),用于保护您的应用程序/代码/API 并调用 PDP
    • 用于检索其他属性和元数据的策略信息点 (PIP)。
  • 请求/响应方案:如何提出问题并获得答案,例如Alice 可以查看文档#123吗?
  • 丰富的政策语言,用于实现政策,例如我之前给出的示例。

在 XACML 中,所有策略都集中在一个位置。一些好处包括: - 更快的开发时间:您不再需要在应用程序中编写授权代码(if/else) - 更好的安全性:无论语言或技术如何,您都可以在所有应用程序中使用相同的策略。因此,我的答案并不特定于 .NET - 更好的审核能力:如果您将 authZ 逻辑移至基于策略的中心点,那么检查它们会更容易 - 实现DRY原则。

这些只是一些可用的好处。

有多种开源和供应商解决方案,例如:

HTH, 大卫。

关于asp.net-mvc - 常见的地方 MVC .NET 中的授权规则最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24562898/

相关文章:

mysql - 如何使用 Controller 中给定的凭据检查数据库连接

authentication - 每当声明停止请求时,HasAnyAuthority 总是让我进入 api

c# - 授权策略的依赖注入(inject)

c# - 如何创建只读复选框 MVC?

asp.net-mvc - 使用 DisplayAttribute 和自定义资源提供程序进行 ASP.NET MVC 3 本地化

javascript - 在 ASP.NET 表单中提交更改的 FormData,以便通过 ModelState 和重定向实现正常行为

ruby-on-rails - 如何在单元测试中伪造 recaptcha?

javascript - 使用 AngularJS 的 ASP.NET 5 路由导航

javascript - 在更新我的 Angular View 之前,如何操作从 JSON 响应派生的对象?

kubernetes - Istio:HTTP授权:验证用户是资源所有者