2012-04-25 112 views
3

我们的应用程序正在从WebForms迁移到MVC。我们有不同的方式来处理授权。查询数据库视图以验证用户授权。根据每个用户,该视图返回所有菜单层次结构。例如,如果User1尝试访问名为SecretList.aspx的页面,则通过菜单层次结构(在auth后保存在HTTP Session中)应用搜索以检查访问授权。如果该用户存在与SecretList.aspx相关的菜单项,则授予访问权限。MVC控制器访问

我的问题是,如何在ASP.NET MVC 3中实现这种方法?

我不喜欢把每个控制器action属性,我一直读到路由约束自定义控制器

对于路由约束,我可以访问HTTP会话并检索我的授权查询的菜单层次结构吗?

要自定义控制器,哪种方法应该考虑重载?在Controller执行完整的Action代码之前,我可以检查授权并重定向到另一个视图吗?

其他更好的主意?

+0

您可以使用标准角色提供程序还是自定义它? http://stackoverflow.com/questions/376655/asp-net-mvc-problem-setting-the-authorize-attribute-role-from-a-variable-requi – kenny 2012-04-25 02:20:43

+0

我没有访问我的代码中的角色数据。所有角色和用户关系都在数据库视图中。 – 2012-04-25 02:41:00

+0

所以他们在SQL成员资格提供者。 – kenny 2012-04-25 02:53:36

回答

2

我会使用全局添加到所有操作的自定义操作过滤器,它的工作方式与构建的Authorize Attribute非常类似。行为过滤器在路由解析并且控制器被创建后运行(因此传递给控制器​​的任何东西都必须可由任何用户构造),然后它可以检查用户是否可以执行该操作,或者是否应该返回另一个ActionResult。

我强烈建议查看MVC源代码(或者使用像ILSpy这样的工具)来查看授权属性的代码。

您可以使用自定义路由约束,但这实际上意味着用户不存在路由,而不是他们不允许访问。

+0

不需要ILSpy:http://aspnet.codeplex。com/ – WDRust 2012-04-25 13:01:43

+0

是的,我知道它现在是开源的,但是你使用ILSpy获得了更好的浏览体验,而不是你从网上做的(去定义,分析用法等) – Betty 2012-04-25 19:53:24

1

如果您不想将属性应用于您的操作并使访问逻辑远离控制器和操作定义,则可以构建全局操作筛选器。

public class MenuAccessAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting (ActionExecutingContext filterContext) 
     { 
      var requestRoute = filterContext.RouteData.Route; 

      var currentUser = WebWorker.CurrentUser; // Or wathever is your thing to get the current user from session 

      if (currentUser != null && !MenuAccessService.UserHasAccessToRoute(currentUser, requestRoute)) 
      { 
       filterContext.Result = new RedirectToRouteResult("MenuAccessDenied"); 
      } 

      base.OnActionExecuting(filterContext); 
     } 
    } 

或沿着这些线。

然后,在Global.asax中的Application_Start

 GlobalFilters.Filters.Add(new MenuAccessAttribute()); 

但是,如果我是你,我会花一些时间适应我的访问逻辑与asp.net的MVC角色,实现自定义RoleProvider和装饰我的控制器并使用正确的授权属性进行操作。