Asp.net mvc 基于控制器授权筛选器隐藏视图中的内容

Asp.net mvc 基于控制器授权筛选器隐藏视图中的内容,asp.net-mvc,Asp.net Mvc,假设我有一个仅限于某些用户的控制器操作,如下所示: [Authorize(Roles="somerole")]<br /> public ActionResult TestRestricted() { return View(); } [授权(Roles=“somerole”)] public ActionResult TestRestricted(){ 返回视图(); } 从一个观点来看,这对每个人都是公开的,我与上面定义的行动有一个链接: &

假设我有一个仅限于某些用户的控制器操作,如下所示:

[Authorize(Roles="somerole")]<br />
public ActionResult TestRestricted()  {            
    return View();
}
[授权(Roles=“somerole”)]
public ActionResult TestRestricted(){ 返回视图(); }
从一个观点来看,这对每个人都是公开的,我与上面定义的行动有一个链接:

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


我想做的是为所有不允许执行“TestRestricted”操作的人隐藏链接。是否有方法检查当前用户是否有权使用相应的操作?除了授权过滤器之外,如果不定义任何附加的或重复的访问规则,MVC框架中就没有任何东西可以在如此精细的级别上控制权限

第一种方法

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

您可以做的是编写一个操作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") %>
public static MvcHtmlString ActionLink(此HtmlHelper、字符串linkText、字符串actionName、字符串角色)
{
MvcHtmlString链接=新的MvcHtmlString(string.Empty);
if(htmlHelper.ViewContext.RequestContext.HttpContext.User.IsInRole(角色))
{
link=htmlhelp.ActionLink(linkText,actionName);
}
返回链接;
}
第二种方法

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

这可能有助于:

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