在MVC中为一种方法覆盖全局过滤器

时间:2013-03-27 16:47:48

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

在我的filterConfig中,我注册了一个全局属性过滤器,需要对我的每个方法进行授权。

但是,我有一个特殊的方法,我想应用不同的授权过滤器属性。如果可能的话,如何实现这一目标?

注意:我不想使用[AllowAnonymous]属性(它无缝地工作并完全忽略我的过滤器),因为我希望通过该方法上的一组不同的授权逻辑来授权请求​​。

2 个答案:

答案 0 :(得分:5)

您可以通过在属性类的AllowMultiple = true属性中设置AttributeUsage来更改过滤器以允许多次过滤,并添加一项检查,以便在过滤器多次出现时使用全局应用的过滤器不执行。传递到ActionExecutingContext的{​​{1}}可让您通过OnActionExecuting()获取过滤器,因此您可以在此处使用。

然后,更改构造函数,以便您可以传入一个参数(可能是枚举),它可以用来决定使用哪种授权方法 - 正常的方法,或另一种授权方法。为该参数赋予一个默认值,使其选择正常的auth方法。然后,在那个需要不同auth方法的方法上,您可以将过滤器与参数的其他值一起应用。所以它可能看起来像这样:

filterContext.ActionDescriptor.GetCustomAttributes()

答案 1 :(得分:3)

您可以编写自己的authorize属性版本并将特定参数传递给您,具体取决于您希望属性执行的操作,例如

public class CustomAuthorizeAttribute : AuthorizeAttribute
   {
        public string currentAction { get; set; }
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
           if (currentAction != "notallowed")
            {
                HandleUnauthorizedRequest(filterContext);
            }
        }
    }

 protected override void HandleUnauthorizedRequest(AuthorizationContext context)
    {
        context.Result = new RedirectResult("/home/login");
    }

然后将其应用于您的课程或行动

[CustomAuthorize(currentAction = "notallowed")]
public class HomeController : Controller
相关问题