0

我正在使用 ASP.Net MVC 4 开发应用程序,并且需要能够在粒度级别授权用户 - 可能是页面上的数据元素,用户可以对一条数据执行的特定操作等。

我目前正在将一个人分配给一个角色,并且该角色被分配了一项活动的权限(查看、添加、编辑和删除)。角色和权限值(我正在使用权限的按位值)分配给活动。我目前正在将一个活动定义为我的 ASP.Net MVC 应用程序中的一个操作。因此,为了导航到 MVC 操作,用户必须至少具有该操作的查看权限,否则他们无法访问该操作。该用户可以在该操作中执行的操作取决于他们的其他权限(添加、编辑、删除)。

这是一个好的方法。所有权限都存储在我的数据库中,因此我已经将权限与 UI 本身分离。例如,我所做的只是检查用户是否在显示加载数据输入表单的按钮之前说添加权限。

我很确定这种方法不够精细。例如,如果我需要在某个角色中隐藏用户 X 的数据列,那么我不确定如何使用我的方法来满足该要求。现在,查看权限是全部或全部。

我非常不愿意在我的视图代码中注入一堆 if 语句来控制向用户显示的内容。这将 UI 与我的安全机制紧密耦合。更不用说你根本无法维持这个。

因此,对于如何使安全机制更加精细,同时保持良好的干净分离,我感到很困惑。当我想到这一点时,我直接跳出了我当前的方法,在我的代码中注入了一堆 if 语句。我没有看到任何替代方案。非常感谢和需要任何关于最佳实践的建议、示例链接等。谢谢你的时间。

4

2 回答 2

1

请不要使这种方法更细化。所有现有的访问控制范例都基于资源是固定的并且不能分割的假设(文件就是一个很好的例子)。否则它会非常复杂和可怕。

问题是您将不同性质的权限混合到同一个框架中。第一种是“谁可以访问资源?”,第二种是“谁应该看到这部分资源?”。

我的建议是增加额外的data filtering layer.

它可以使用现有的相同角色权限分配结构,甚至可以扩展它。从功能上讲,这个新层和主访问控制应该是相互独立的。如果关闭其中一个,其余系统应继续正常工作。

这种“基于角色的数据过滤”子系统应该根据情况仔细规划。在 asp.net mvc 过滤可以在两个级别进行:

  1. 数据访问。当从 DB 中读取数据时,部分数据会因访问而被隐藏。

  2. 介绍。以最简单的方式,不同的视图呈现不同级别的数据访问。复杂的方法是使用自定义 HtmlHelper 扩展 - 它调用新的子系统来检查渲染时的访问。


小更新:

由于访问控制系统的主要关注点是“对象”,因此您可能可以考虑一下您所理解的“对象”。例如,可以考虑一个对象字段(列)。这样的转变将是一个根本性的变化,当然会带来复杂性,但它可以实现您的大部分需求。

这将类似于 SQL,其中用户应指定所需的列,并且系统在请求执行之前检查列访问,因此您可能想研究它是如何在那里完成的。

于 2013-08-01T19:59:03.487 回答
0

我发现我正在寻找的是所谓的基于声明的安全性。.Net 4.5 现已推出。以下是一系列精彩的文章,将引导您完成该过程:

基于声明的安全性简介

于 2013-08-03T03:17:08.570 回答