2013-08-05 93 views
6

我正在尋找重新使用我當前定義的控制器/操作授權屬性來指定顯示菜單項的用戶訪問角色(因此用戶只能看到他們有權訪問的菜單項)。重用MVC控制器角色菜單項的顯示授權

當前顯示的菜單項和控制器/操作授權屬性角色是不同的,所以任何更改都需要在兩個地方進行更新,這可能在將來容易出錯。

我一直在尋找到自定義授權屬性,這是我到目前爲止有:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (!isAuthorized) 
     { 
      return false; 
     } 

     var routeData = httpContext.Request.RequestContext.RouteData; 
     string currentAction = routeData.GetRequiredString("action"); 
     string currentController = routeData.GetRequiredString("controller"); 

     var currentUserRoles = GetCurrentUserRoles(); 

     // from the list of menu items, find the menu item with the current action 
     // and controller and check the current user's roles entitle access 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary(
       new 
       { 
        controller = "Error", 
        action = "Unauthorised" 
       }) 
      ); 
    } 
} 

的MenuItems基本上是由用戶角色菜單項可用於爲前端顯示的文本標籤以及來自控制器和操作的網址。 MenuItems在部分視圖中呈現,具體取決於當前用戶是否具有顯示MenuItem所需的角色。

從我所看到的情況來看,我可能需要所有控制器操作的詳盡列表以及相關用戶角色在兩個區域中重複使用,是否有更優雅的方法來實現此目的?

回答

3

經過進一步研究,我偶然發現了AuthorizedActionLink nuget包。基本上,這是一個基於ActionLink的Html Helper,只有當用戶有權訪問目標控制器動作時纔會顯示鏈接(請參閱https://authorizedactionlink.codeplex.com/)。

因此,接着我不再使用@Html.ActionLink(),而是使用@Html.AuthorizedActionLink(),並且該菜單是根據在控制器/操作級別指定的用戶權限構建的。

還有@Html.ActionIsAccessibleToUser(actionName, controllerName),因此可以省略鏈接周圍的標記,例如<li>

0

最好的辦法是將授權邏輯放到一個單獨的類中,然後在不同的地方使用它們。 CustomAuthorize,菜單項限制。這樣就不會違反DRY。