1

我真的很感激一些关于我正在努力实现的反馈:

问题:

  1. 我想授权我的应用程序的用户在控制器上执行单个操作。例如:如果用户具有所需的授权,他可以对我的控制器类执行“保存”操作。
  2. 在我正在处理的项目中,角色的创建和他们的授权是由客户部署团队完成的,而不是我的控制。因此,我编写了一个可以分配给角色/用户的“控制点”,而我的应用程序只需要检查那个控制点。
  3. 如何在 ASP.Net MVC 中获取控制点概念?更具体地说,如何根据控制器上的用户权限启用/禁用视图上的按钮?

我的解决方案:

  1. 参考:http ://weblogs.asp.net/fredriknormen/archive/2008/03/12/asp-net-mvc-framework-2-interception-and-creating-a-role-action-filter.aspx - as一个起点
  2. 我没有像上面链接中解释的那样创建角色过滤器,而是有一个 ControlPointFilter 类,它可以获取模型并进行授权检查。
  3. 我遇到的问题是在 View 类中,我目前正在传递用户在 ViewData[] 集合中可以访问的控制点集合。
  4. 在 View 类中,我正在检查 ViewData 集合中是否存在相关的控制点(我不喜欢 - 希望在 View 类中将代码保持在最低限度)
  5. 另一个问题是 - 虽然在控制器类的属性中设置了实际的控制点名称,但我在哪里/如何将这些属性传递给视图并保持视图清洁?

希望对您有所帮助并感谢您的时间/努力来回答这个问题!

晴天

4

2 回答 2

1

一种可能的解决方案是将控制点转换为控制器操作中的视图属性(也许这些是相同的东西,但从您的问题中并不清楚)。想法是您的控制点将转换为有意义的视图方向,例如“AllowEdit”、“AllowSave”、“AllowDetailedView”等。这些将成为 ViewData 中的条目。

使用基本控制器类来扩展 Controller 并为其提供 ControlPoint 集合。让您的过滤器在控制器中填充此集合。让基本控制器 OnActionExecuted 方法使用此集合,并且在 ViewResult 的情况下,使用视图指令集合的适当值填充 ViewData。各个控制器操作也可以使用 ControlPoint 集合来确定它们是否需要根据视图是否会呈现额外数据来为各个视图提供数据。

在您看来,不依赖于控制点本身,而是依赖于基本控制器确定的视图方向。通过这种方式,您将视图与控制点逻辑分离。视图仅以对视图有意义的方式对视图数据进行操作,而不是对在应用程序上下文中有意义的基于权限的数据进行操作。视图不会关心特定指令的设置方式或原因,它只需要根据指令的值适当地呈现。

于 2009-05-17T16:18:54.597 回答
0

嗯,你能不能简单地创建一个模板系统来为用户分配角色?即创建具有角色“CustomerService”和“ConfigurationEditor”的用户模板“Power User”,然后像往常一样使用角色系统(即Roles.IsUserInRole(username, rolename))?

对于操作,然后使用

[Authorized(Roles="CustomerService,CustomerServiceAdmin")]
public ActionResult Edit(...)
{
}

对于视图,您使用

<% if (Roles.IsUserInRole(Context.User.Name, "CustomerService")) %>
于 2009-05-17T15:45:27.110 回答