在Web Api中,有三种Filter
Filter类型 | 实现的接口 | 描述 |
Authorization | IAuthorizationFilter | 最先运行的Filter,被用作请求权限校验 |
Action | IActionFilter | 在Action运行的前、后运行 |
Exception | IExceptionFilter | 当异常发生的时候运行 |
需要哪种过滤器就实现哪个接口
下面主要说IAuthorizationFilter
注意是 System.Web.Http.Filters 命名空间下的
实现后会有一个AllowMultiple的属性和ExecuteAuthorizationFilterAsync的方法
public class filter : IAuthorizationFilter { public bool AllowMultiple => throw new NotImplementedException(); public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) { throw new NotImplementedException(); } }
AllowMultiple是设置是否支持并发的属性,如果想要支持就把=>后面改为true
public bool AllowMultiple => true;
ExecuteAuthorizationFilterAsync 内
return await continuation();就是继续向下执行
return new HttpResponseMessage();就是中止操作,直接以HttpResponseMessage为返回值
我们弄好了filter,怎么让它起作用?
注册filter一共有三种方式
第一种:
在Action上添加特性 [AuthFilter]
这样这个Action就会触发filter,适合单个Action的权限控制
public class StudentController : ApiController { [AuthFilter] public string Post(CreateUser user) { return ""; } }
第二种:
在Controller上添加特性 [AuthFilter]
这样这个controller的所有action都会触发filter,适合整个controller的权限控制
[AuthFilter] public class StudentController : ApiController { public string Post(CreateUser user) { return ""; } }
第三种:
在App_Start的WebApiConfig中加入
这样这个项目的所有controller所有action都会触发filter
public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); config.Filters.Add(new filter()); //添加过滤器 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
但是我们如果有个别action不想触发filter怎么办?
可以在这个action上添加特性[AllowAnonymous],这样过滤器就会"放过"这个action