2012-04-25 118 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和裝飾我的控制器並使用正確的授權屬性進行操作。