在MVC中为一个方法重写一个全局过滤器

本文关键字:一个 重写 全局 过滤器 方法 MVC | 更新日期: 2023-09-27 18:06:22

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

但是,我有一个特殊的方法,我想在其中应用不同的授权筛选器属性。如果可能的话,一个人如何做到这一点呢?

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

在MVC中为一个方法重写一个全局过滤器

您可以通过在属性类的AttributeUsage属性中设置AllowMultiple = true来更改过滤器以允许多个过滤器,并添加一个检查,以便如果过滤器出现多次,则全局应用的过滤器不会执行。传递到OnActionExecuting()ActionExecutingContext让您通过filterContext.ActionDescriptor.GetCustomAttributes()获得应用的过滤器,因此您可以在这里使用它。

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

public class CustomAuthAttribute : AuthorizeAttribute
{
    public CustomAuthAttribute(AuthMethod method = AuthMethod.StandardAuth)
    {
        //stuff
    }
}
[CustomAuth(AuthMethod.WeirdAuth)]
public ActionResult MethodThatNeedsDifferentAuth()
{
    //stuff
}

您可以编写自己版本的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