2012-03-15 85 views

回答

4

我不認爲有這樣一個簡單的解決方案,而不反映Controller,得到Action和檢查AuthorizationFilters

即便如此,另一種解決方案可能是創建一個Html.ActionLink的擴展方法重載,其中需要角色名稱並檢查User.IsInRole(roleName)。如果用戶有權訪問指定的角色,則只輸出一個鏈接。

事情是這樣的:

public static class EntentionMethods 
{ 
    public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, string roleName) 
    { 
     if (!helper.ViewContext.RequestContext.HttpContext.User.IsInRole(roleName)) 
     { 
      return MvcHtmlString.Empty; 
     } 

     return helper.ActionLink(linkText, actionName, controllerName); 
    } 
} 

不漂亮,你可能一直希望,但是這往往提供的需求。

1

Authorize屬性應放置在您想限制訪問的控制器動作(或控制器本身)上,這樣您只強制執行角色爲「somerole」的用戶訪問生成和來自的鏈接控制器的行爲。您想要限制訪問的鏈接將不會從「授權」屬性中顯示。如果明確定義角色和用戶,它只會限制和強制角色中的用戶或具有特定名稱的用戶訪問操作。

1

一種可能性是使用MvcSiteMapProvider作爲菜單。它具有內置的security trimming功能,可根據AuthorizeAttribute自動隱藏鏈接。如果您不喜歡內置的HTML助手,您可以自定義模板和/或構建您自己的HTML助手,以隱藏基於節點可訪問性的鏈接。或者,如果您不想使用第三方庫,則可以對AuthorizeAttributeAclModule進行逆向工程,以制定您自己的實施方案。

全面披露

我MvcSiteMapProvider的主要貢獻者。