如何防止执行特定的自定义操作过滤器

Mas*_*our 4 asp.net asp.net-mvc

我有一个像这样的自定义操作过滤器:

public class MySecurityTest : ActionFilterAttribut{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //Do some security tests
        base.OnActionExecuting(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

我将其添加到FilterConfig所有操作中。但我需要一些操作在没有它的情况下工作。现在我使用这样的东西:

public class MySecurityTest : ActionFilterAttribute
{
    public bool CheckRules { get; set; }

    public MySecurityTest(bool checkRules = true)
    {
        CheckRules = checkRules;
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (CheckRules)
        {
            //Do some security tests   
        }
        base.OnActionExecuting(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

和用法:

[MySecurityTest(false)]
public ActionResult Index()
{
   return View();
}
Run Code Online (Sandbox Code Playgroud)

但如何构建类似[AllowAnonymous]属性的东西

此致

Dar*_*rov 5

但如何构建类似 [AllowAnonymous] 属性的东西

实际上很简单:

[AttributeUsage(AttributeTargets.Method)]
public class ExcludeMySecurityAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)

然后在你的过滤器帐户中:

public class MySecurityTest : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(ExcludeMySecurityAttribute), true).Any())
        {
            // The controller action is decorated with the exclude attribute
            // so you should probably do nothing here
        }
        else
        {
            // Do your security tests here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在剩下的就是装饰了:

[ExcludeMySecurity]
public ActionResult Index()
{
   return View();
}
Run Code Online (Sandbox Code Playgroud)


Nig*_*888 5

您只需创建另一个属性并使用 .NET 反射来检查它是否存在。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (!HasMyIgnoreAttribute(filterContext))
    {
        //Do some security tests   
    }
    base.OnActionExecuting(filterContext);
}

public bool HasMyIgnoreAttribute(ActionDescriptor actionDescriptor)
{
    // Check if the attribute exists on the action method
    bool existsOnMethod = actionDescriptor.IsDefined(typeof(MyIgnoreAttribute), false);

    if (existsOnMethod)
    {
        return true;
    }

    // Check if the attribute exists on the controller
    return actionDescriptor.ControllerDescriptor.IsDefined(typeof(MyIgnoreAttribute), false);
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个自定义属性来装饰您的操作/控制器。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class MyIgnoreAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)

用法

[MySecurity]
public class MyController
{
    [MyIgnore]
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

ActionFilterAttribute一般来说,如果您使用依赖注入,最好不要使用,因为属性不应包含此答案中的任何行为。您还应该考虑使用授权过滤器(或 AuthorizationAttribute 继承类)而不是操作过滤器来进行安全检查,因为它是在管道的早期完成的。