2012-03-15 86 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的主要贡献者。