2

例子

用户“jtirado”被分配角色“HR-Assistant”,可以访问路由“mymvcapp/employeeee/edit/1452”来编辑员工(id:1452)数据。

作为“HR-Assistant”,该用户可以更改员工电话号码和电子邮件,可以查看员工工资但不能编辑金额。

电话号码、电子邮件、工资是数据库字段,由视图上的“asp.net-mvc-control”或“HTML-control”表示/呈现。所以我想根据用户的角色限制对这些控件的访问。

以往的经验

我之前使用 MasterPage、BasePage 类和 RoleBasedAccessControl 数据库模型为经典的 3 层 ASP.Net 3.5 Web 表单应用程序完成了此操作。

MasterPage 根据分配的角色构建用户可以访问的选项菜单。

BasePage 类检查用户是否有权访问所需页面,如果是,则检查用户可以编辑哪些控件(例如:DdlClientType、TxtLastName、ChkIsActive)。

这样,我不必使用 if-then 语句来检查权限,而且我可以创建任意数量的角色,为他们提供任何权限,而无需更改任何 C# 代码。

我计划为这个新的 MVC 应用程序使用相同的 RoleBasedAccessControl 数据库模型。

问题

所以我的问题是关于如何使用 ASP.Net MVC 3 实现 MasterPage 和 BasePage 类,或者是否有另一种实现方式,以及我是否应该以其他方式实现。

在我看来,ViewMasterPage 是与 Web-Forms-MasterPages 等效的 MVC。我还听说过 Razor 布局页面。

无论如何,我想我应该在控制器中处理所有这些。

我将使用:

  1. ASP.NET MVC 3.0
  2. 剃刀

我检查了这些帖子:

asp.net mvc 用户权限和视图

控制对表单字段的访问的最佳实践

控制权限的最佳实践?

ASP.NET MVC 母版页

实现安全的 ASP.NET MVC 应用程序

但它们并不完全适合我的情况。

4

2 回答 2

2

听起来您可以使用自定义编辑器模板,并在其中包含您的逻辑。

在您的 Viewmodel 中,您可以使用属性来确定将使用哪个模板 - 使用UIHint或通过设置 DataType 属性并为此使用自定义模板。

然后您的编辑器模板可以确定是渲染编辑值还是显示值(或完全隐藏)。不要忘记在您的活页夹中强制执行相同的规则,否则您就有可能让用户操纵他们不应访问的数据。

于 2012-08-29T02:47:24.237 回答
1

Razor 引擎的一个问题是页面上没有“控件”集合,就像在 WebForms 中一样。因此,您将无法遍历页面中的所有控件并对它们进行操作。

也就是说,您仍然可以通过子类化System.Web.Mvc.WebViewPage和/或System.Web.Mvc.WebViewPage<TModel>如上一个问题中所述来使用“基本视图”的想法。同样,从 Controller 继承也将有助于基本控制器。

我不确定我在这里有一个具体的答案,但我做的一件事是在我的模型属性上添加自定义属性,指示哪些角色可以访问它们。然后我重载了内置方法,例如@Html.TextBoxFor(),传入当前用户的角色。在重载中,我根据属性上的属性检查角色参数。

在您的情况下,属性可能不起作用,而是您将从数据库中读取授权;相同的想法,只是不同的实现。

希望这能让你朝着正确的方向前进。

于 2012-08-28T19:27:45.670 回答