asp.net core 将actionFilter 标记在控制器后 ,如何实现控制器内某个Action 避开检查

1.在开发中我们常常会用 ActionFilter 实现判断用户是否登录。如:我们定义一个LoginFilter

 public class LoginFilter : Attribute, IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.ActionDescriptor.EndpointMetadata.Any(it => it.GetType() == typeof(EmptyFilter)))
            {
                return;
            }
            if (context.HttpContext.Session.GetString("User") == null)
            {

                //context.Result=new action
                context.HttpContext.Response.Redirect("/Login/index/");

                context.Result = new EmptyResult();
                return;

            }
        }
    }

然后 可将此过滤器 给需要登录访问的控制器或ation 打一个标记。

    [LoginFilter]
    public class HomeController : BaseController
    {
        
        private readonly hy_contentService _userMessageService;

        public HomeController(hy_contentService userMessageService)
        {
            _userMessageService = userMessageService;
        }
         [EmptyFilter]
        public IActionResult Index()
        {

           var list= _userMessageService.getAll();


            return  Json( list);
        }

        public IActionResult main_view()
        {
            return View();
        }

        
    }

 

 

 

如何 让HomeController 中 Index action 避开 LoginFilter 检查呢?

首先,我们自定义一个空的actionFilter ,命名为EmptyFilter;

 

 以下定义好的EmptyFilter  无任何操作。

 

 1  public class EmptyFilter : Attribute, IActionFilter
 2     {
 3         public void OnActionExecuted(ActionExecutedContext context)
 4         {
 5            // throw new NotImplementedException();
 6         }
 7 
 8         public void OnActionExecuting(ActionExecutingContext context)
 9         {
10            // throw new NotImplementedException();
11         }
12     }

   然后我们将 EmptyFilter标记在 Index 之上;

       [EmptyFilter]
        public IActionResult Index()
        {
           var list= _userMessageService.getAll();
            return  Json( list);
        }

 

最后在LoginFilter 中加入以下代码:

      if (context.ActionDescriptor.EndpointMetadata.Any(it => it.GetType() == typeof(EmptyFilter))) { return; }

以上代码表示 当 控制器(HomeController ) 上标记 LoginFilter 时,再遇到标记EmptyFilter 的action 自动跳过登录检查。

通过上述操作可实现  HomeCotroller 标记了 LoginFilter(表示所有action 都要通过LoginFilter验证登录),index 可以跳过 LoginFilter 验证;

上一篇:WebApi 通过ActionFilter 来响应请求


下一篇:Vulnhub DC4