MVC4:确定ControllerName和ActionName的当前用户访问权限

时间:2013-09-05 03:21:21

标签: asp.net-mvc asp.net-mvc-4

我正在考虑在当前站点中创建安全修剪的MenuLinks,并想知道MVC4中最简单的方法是确定当前用户是否只使用控制器名称和操作名称来访问给定的Controller和Action。 / p>

我遇到了一些问题\答案,其中包含“解决方案”的链接断开,以及一对目标版本的MVC看起来很复杂。我想如果我必须创建给定控制器的实例,获取授权属性然后手动进行安全检查,但我真的希望在MVC4中可能有更简单的方法! :)

基本上我正在寻找关于如何在下面实现“UserHasAccessTo”的等效或建议:

    public static MvcHtmlString SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName)
    {
        if(UserHasAccessTo(actionName, controllerName))
            return htmlHelper.ActionLink(linkText, actionName, controllerName);
        return MvcHtmlString.Empty;
    }

1 个答案:

答案 0 :(得分:0)

以下是一种简单安全的方式

  1. 定义一个继承自AuthorizeAttribute并覆盖AuthorizeCore

    的属性
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
                             Inherited = true, AllowMultiple = true)]
        internal sealed class MyAttribute : AuthorizeAttribute
        {
            protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                var username = httpContext.User.Identity.Name;
    
                if (string.IsNullOrEmpty(username))
                    return false;
    
                return UserHasAccessTo(username, ActionName, ControllerName);
            }
    
            public bool ActionName { get; set; }
    
            public bool ControllerName { get; set; }
        }
    
  2. 覆盖HandleUnauthorizedRequest

    protected override void 
                 HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = string.Empty;
    }
    
  3. 将属性应用于您的方法或类