基于控制器授权过滤器隐藏视图上的内容

时间:2009-09-24 10:01:01

标签: asp.net-mvc

假设我的控制器操作仅限于某些用户,例如:

[Authorize(Roles="somerole")]<br />
public ActionResult TestRestricted()  {            
    return View();
}

在一个视图中,这对每个人都是公开的,我有一个指向上面定义的操作的链接:

<%= Html.ActionLink("Click here!", "TestRestricted") %>

我想要做的是为每个不允许执行“TestRestricted”-action的人隐藏链接。有没有办法检查当前用户是否有权使用相应的操作?除了授权过滤器之外,没有定义任何额外的或重复的访问规则?

2 个答案:

答案 0 :(得分:2)

MVC框架中没有任何东西可以在如此精细的级别上控制权限。

第一种方法

这是迄今为止最简单的方法。缺点是必须将角色分配给每个操作链接。

您可以做的是编写一个Action HtmlHelper来控制链接级别的权限。确保包含名称空间System.Web.Mvc.Html

    public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string role)
    {
        MvcHtmlString link = new MvcHtmlString(string.Empty);

        if (htmlHelper.ViewContext.RequestContext.HttpContext.User.IsInRole(role))
        {
            link = htmlHelper.ActionLink(linkText, actionName);
        }

        return link;
    }

<%= Html.ActionLink("Click here!", "TestRestricted", "somerole") %>

第二种方法

您可以使用反射来发现被调用的动作(方法)。一旦发现,对属性的简单检查将告诉您是否存在authorize属性以及它的设置角色。

答案 1 :(得分:1)

这可能有所帮助:http://weblogs.asp.net/rashid/archive/2009/09/06/asp-net-mvc-and-authorization-and-monkey-patching.aspx

我也在试图找到这个问题的答案......