2009-05-17 68 views
1

我会很感激的是我想实现一些反馈:ASP.Net MVC和会员

问题:

  1. 我想我的应用程序的用户授权以单个动作在控制器上。例如:如果用户具有所需的授权,则可以在我的控制器类上执行“保存”操作。
  2. 在我正在开发的项目中,创建角色&他们的授权是由客户端部署团队&完成的,不在我的控制之下。所以,我编程到一个可以分配给角色/用户的“控制点”,而我的应用程序只需要检查该控制点。
  3. 如何将控制点概念导入ASP.Net MVC?更具体地说,如何根据控制器上的用户权限启用/禁用View上的按钮?

我的解决办法:

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

希望能帮助&感谢您的时间/努力来回答这个问题!

阳光

回答

1

一个可能的解决方案,这是把控制点到视图控制器的操作属性(也许这些都是但是,从你的问题来看,并不清楚)。这个想法是,你的控制点将转化为有意义的视图方向,例如“AllowEdit”,“AllowSave”,“AllowDetailedView”等。这些将成为ViewData中的条目。

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

在您看来,不依赖于控制点本身,而是依赖于基本控制器确定的视图方向。这样你就可以从控制点逻辑中分离视图。视图仅以对视图有意义的方式对视图数据进行操作,而不对基于权限的数据在应用程序上下文中有意义。该视图不会关心特定指令的设置方式或原因,只需根据指令的值进行适当渲染即可。

+0

嗨tvanfosson - 这个解决方案看起来不错,我一定会尝试。我还不清楚如何将控制器上的属性传递给控制器​​基类以添加到控制点集合中。 也许我错过了一点 - 但我相信使用您的解决方案,我会有一个代码:base.ControlPointCollection.Add(“my_control_point”);而同样的东西已经被作为属性的行动方法(或者我不应该在这种情况下使用属性?) Sunny – Sunny 2009-05-17 17:01:04

0

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

对于操作,然后使用

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

对于视图,您使用

<% if (Roles.IsUserInRole(Context.User.Name, "CustomerService")) %> 
+0

嗨索拉斯 - 非常感谢您的答复。 是的 - 我可以做你的建议,但有一个视图和控制器之间的耦合我想避免这一点,因为我会创建视图,可以共享和只会改变可能执行的各种操作。 – Sunny 2009-05-17 16:51:41