显示仅限访问权限的链接

时间:2012-03-15 23:43:26

标签: asp.net-mvc

有没有办法如何只显示带有访问权限的链接,由

定义
[Authorize(Roles = "SomeRole")]

在控制器中?

3 个答案:

答案 0 :(得分: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 :(得分:1)

Authorize属性应该放在您要限制访问的控制器操作(或控制器本身)上,这样您只能强制执行“somerole”角色的用户访问生成和从中生成的链接。控制器动作。您要限制访问的链接将不会显示在“授权”属性中。如果明确定义了角色和用户,它只会限制和强制角色中的用户或具有特定名称的用户访问操作。

答案 2 :(得分:1)

一种可能性是使用MvcSiteMapProvider作为菜单。它具有内置的security trimming功能,可根据AuthorizeAttribute自动隐藏链接。如果您不喜欢内置的HTML帮助程序,则可以自定义模板和/或构建自己的HTML帮助程序,以根据节点可访问性隐藏链接。

或者,如果您不想使用第三方库,则可以对AuthorizeAttributeAclModule进行反向工程以实现自己的实施。

完全披露

我是MvcSiteMapProvider的主要撰稿人。