在.Net Core 中使用AuthorizeFilter或者ActionFilterAttribute来实现登录权限验证和授权 一、AuthorizeFilter 新建授权类AllowAnonymous LoginAuthorzation>(); // 添加身份验证过滤器 } context.HttpContext.Request.Path.Value 获取请求过来的url 二、ActionFilterAttribute 创建权限判断类继承ActionFilterAttribute public class ActionFilterAttributeLogin: ActionFilterAttribute { base.OnActionExecuting(filterContext); } public class NoPermissionRequiredAttribute : ActionFilterAttribute
在asp.net mvc 中 webapi 和 mvc 处理消息是两个不同的管道,Asp.net mvc 和 webapi 为我们提供的 ActionFilterAttribute 拦截器,通过 重写 通过ActionFilterAttribute ,就能拦截action 处理的所有内容,包括请求提交的参数以及返回值。 由于asp.net MVC 与webapi 是两个完全独立的管道: MVC由System.Web.Mvc.ActionFilterAttribute 来做action请求的拦截。 webapi 由 System.Web.Http.Filters.ActionFilterAttribute 来处理。 这样就可以注册你的 ActionFilterAttribute 成为全局的Filter,系统中请求经过Action 之前或之后 都会被你的ActionFilter 拦下来做处理然后在转交下去。
但是如何给过滤器ActionFilterAttribute也用上构造函数注入呢? 问题 我的博客系统里有个用来删除订阅文件缓存的ActionFilter,想要在发生异常的时候记录日志。 整个过滤器的代码如下: public class DeleteSubscriptionCache : ActionFilterAttribute { private static readonly Logger 于是代码变成了这样: public class DeleteSubscriptionCache : ActionFilterAttribute { protected readonly ILogger
public class BasicAuthenticationAttribute : ActionFilterAttribute { private readonly IAppService 继续查找问题,点开ActionFilterAttribute的元数据: public abstract class ActionFilterAttribute : Attribute, IActionFilter BasicAuthenticationAttribute,重写OnResultExecutionAsync方法: public class BasicAuthenticationAttribute : ActionFilterAttribute When using abstract classes like ActionFilterAttribute, override only the synchronous methods or the 当使用抽象类,比如ActionFilterAttribute,只需重写同步方法或者异步方法其中一个。
ActionFilterAttribute Result filter IResultFilter 分别在Action Result执行之后和之前 ResultFilterAttribute 或者 action method, 或者 action result 抛出一个异常时候执行 HandleErrorAttribute 大家注意一点,Asp.Net MVC提供的ActionFilterAttribute 而ActionFilterAttribute是一个Abstract的类型,所以不能直接使用,因为它不能实例化,所以我们想使用它必须继承一下它然后才能使用,下图所示的是ActionFilterAttribute 的实现: 所以我们在实现了ActionFilterAttribute,然后就可以直接重写一下父类的方法如下: publicvirtualvoid OnActionExecuted(ActionExecutedContext 首先我们添加一个普通的类,直接上代码吧: publicclass DemoActionAttributeFilter : ActionFilterAttribute { publicstring
{ return "MyService"; } } public class FilterInjectAttribute: ActionFilterAttribute 改一下FilterInjectAttribute构造器多加入2个参数,并且保证这2个参数无法从DI中取到: public class FilterInjectAttribute: ActionFilterAttribute 总结 ActionFilterAttribute的依赖注入可以通过ServiceFilterAttribute,TypeFilterAttribute来实现 ServiceFilterAttribute 是通过DI容器来管理ActionFilterAttribute;TypeFilterAttribute则是通过一个工厂直接实例化,所以使用前不需要注册到DI容器中。 当实例化ActionFilterAttribute的时候如果构造器参数类型没有在DI容器中注册那么会尝试从Arguments列表中取。
AuthenticationControllor { public ActionResult Index() { return View(); } } 继承ActionFilterAttribute ActionFilterAttribute里也有OnActionExecuting方法,跟Controller一样, 同是抽象实现了IActionFilter接口。 派生类如下: // 登录认证特性 public class AuthenticationAttribute : ActionFilterAttribute { public override void
: Authorization | IAuthorization | AuthorizeAttribute | 首先运行,在其他过滤器的操作方法 Action | IActionFilter | ActionFilterAttribute | 运行之前和之后的动作方法 Result | IResultFilter | ActionFilterAttribute | 运行前后执行的操作结果 Exception | IExceptionFilter 创建过滤器 Filter 目录下新建一个类MyAction,并继承ActionFilterAttribute public class MyAction: ActionFilterAttribute { 结果过滤器 同样继承自ActionFilterAttribute实现,并提供了在两个不同时间点执行代码的能力,分别在 结果执行前(On ResultExecuting)/结果执行后(OnResultExecuted 创建结果过滤器 首先创建过滤器 MyResult.cs,同样的,在 Filter 文件夹下新建一个类,继承自 ActionFilterAttribute public class MyResult: ActionFilterAttribute
> SortActionFilters(Stack<MemberInfo> memberChain) { List<ActionFilterAttribute> filters ActionFilterAttribute[] attrs = (ActionFilterAttribute[])member.GetCustomAttributes(typeof(ActionFilterAttribute SortedList<int, ActionFilterAttribute>(); foreach (ActionFilterAttribute filter in 一层一层调用所有的 ActionFilterAttribute.OnActionExecuting 方法,直到 MoveNext() == false。 这样所有ActionFilterAttribute.OnActionExecuted 也被执行完成。
而本文的需求实际就是限制只能使用本机的 IP 进行访问 先添加一个类 LocalClientIpCheckActionFilter 继承 Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute 类 public class LocalClientIpCheckActionFilter : ActionFilterAttribute { } 在 LocalClientIpCheckActionFilter 对应的在 ActionFilterAttribute 里面可以重写的,还有 OnActionExecuted 方法,不同之处在于 OnActionExecuting 将会在调用之前被调用,而 OnActionExecuted
ExceptionFilter(异常处理过滤器)
过滤器类型 接口 默认实现 描写叙述
Action IActionFilter ActionFilterAttribute 在动作方法之前及之后执行
Result IResultFilter ActionFilterAttribute 在动作结果被执行之前和之后执行
AuthorizationFilter IAuthorizationFilter AuthorizeAttribute ///
监控程序实现 改监控程序主要继承ActionFilterAttribute类,在命名空间:System.Web.Http.Filters中,重写OnActionExecuted(HttpActionExecutedContext 在上一篇文章介绍MVC的监控也是重写ActionFilterAttribute类,但是MVC的ActionFilterAttribute在System.Web.Mvc命名空间下。 AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] public class WebApiTrackerAttribute : ActionFilterAttribute
图二 1.定义:以为例,可以通过继承ActionFilterAttribute并override它的OnActionExecuting和OnActionExecuted方法实现。 有好几种,但由于本文主要是分享Filter的运行机制,所以只以ActionFilter一种来举例,现在定义一个Test1Filter如下: public class Test1Filter : ActionFilterAttribute base.OnActionExecuted(context); //do...... } } 很简单,可以很方便的通过继承系统提供的ActionFilterAttribute 当然我们可以自定义Filter的Order使其不再采用默认值0,只需在其构造函数中设置即可 public class Test1Filter : ActionFilterAttribute
AuthorizationFilter的实现最好是派生自AuthorizeAttribute类,而不是派生IAuthorizationFilter 看看AuthorizetionAttribute的实现: 看看ActionFilterAttribute 其他操作过滤器(如OutputCacheAttribute)实现抽象的ActionFilterAttribute类,该类可以在操作方法运行之前或之后使运行过滤器运行。
FilterAttribute, IAuthorizationFilter 阻止伪造请求 6)AsyncTimeoutAttribute public class AsyncTimeoutAttribute : ActionFilterAttribute NoAsyncTimeoutAttribute : AsyncTimeoutAttribute 设置异步操作永不超时 8)OutputCacheAttribute public class OutputCacheAttribute : ActionFilterAttribute //处理能找到此控制器,但找不到请求对应的操作 } } 扩展授权过滤器(AuthorizeAttribute) 具体示例见:验证、授权与安全 动作过滤器(ActionFilterAttribute ) ActionFilterAttribute是一个抽象类,有四个方法: 操作执行后被框架自动调用的方法:OnActionExecuted 操作执行前被框架自动调用的方法:OnActionExecuting
为了让用户更简单的创建一个自定义Action filter,ASP.NET MVC Framework提供了一个基类ActionFilterAttribute,这个类实现了IActionFilter和IResultFilter ActionFilterAttribute类有以下的方法可以重写: OnActionExecuting – 在controller action执行之前调用 OnActionExecuted – 在controller using System.Globalization; using System.Web.Mvc; public class ExecutionTimingAttribute : ActionFilterAttribute
看了下代码,一分析还真是: public class ProcessViewResultAttribute : ActionFilterAttribute { public override void controller.ViewBag.PublicModulus = RSAUtil.PublicPars.PublicModulus; base.OnResultExecuting(context); } } ActionFilterAttribute
public class MyAttributeFilter: ActionFilterAttribute { public override void OnActionExecuted ; } } public class MyOPAttributeFilter : ActionFilterAttribute { public 比如我们想在操作方法的MyOPAttributeFilter筛选属性 注入IHostEnvironment: public class MyOPAttributeFilter : ActionFilterAttribute
相同类型的过滤器还可以定义在某个阶段执行的顺序 授权过滤器 AuthorizeAttribute 资源过滤器 IResourceFilter 异常过滤器 IExceptionFilter 操作过滤器 ActionFilterAttribute 操作过滤器 ActionFilterAttribute 和 结果过滤器 IResultFilter 操作过滤器:当请求进入 API 接口的时候,操作过滤器提供了一个进入之前(before)和进入之后( IFilterMetadata, IAsyncActionFilter, IResultFilter, IAsyncResultFilter, IOrderedFilter { protected ActionFilterAttribute 个基础方法,分别是执行前(before)执行后(after),写入结果前(before)写入后(after) 为什么会这样呢,因为操作过滤器实现的接口中包含了结果过滤器的接口 根据官方的提示,如果你需要重写 ActionFilterAttribute Core 下系统内置的各种各样的过滤器,分别是 > 授权过滤器 AuthorizeAttribute 资源过滤器 IResourceFilter 异常过滤器 IExceptionFilter 操作过滤器 ActionFilterAttribute
Filter要继承于ActionFilterAttribute抽象类,并可以覆写void OnActionExecuting(ActionExecutingContext)和 void OnActionExecuted Action的Filter 下面我给大家一个示例,来看看它的的执行顺序 首先我们先建立 一个Filter,名字叫做TestFilter public class TestFilter : ActionFilterAttribute