在需要进行校验的地方可以打上相应的Attribute

时间:2022-05-21 09:04:53

  在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截措置惩罚惩罚。引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想,通过Filter能统一地对一些通用逻辑进行措置惩罚惩罚,如:权限校验、参数加解密、参数校验等方面我们都可以操作这一特性进行统一措置惩罚惩罚,今天我们来介绍Filter的开发、使用以及讨论他们的执行挨次。

一、Filter的开发和挪用

在默认的WebApi中,框架供给了三种Filter,他们的成果和运行条件如下表所示:

Filter 类型

 

实现的接口

 

描述

 

Authorization

 

IAuthorizationFilter

 

最先运行的Filter,被用作请求权限校验

 

Action

 

IActionFilter

 

Action运行的前、后运行

 

Exception

 

IExceptionFilter

 

当异常产生的时候运行

 

首先,我们实现一个AuthorizatoinFilter可以用以简单的权限控制:

public class AuthFilterAttribute : AuthorizationFilterAttribute { public override void OnAuthorization(HttpActionContext actionContext) { //如果用户方位的Action带有AllowAnonymousAttribute,则不进行授权验证 if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()) { return; } var verifyResult = actionContext.Request.Headers.Authorization!=null && //要求请求中需要带有Authorization头 actionContext.Request.Headers.Authorization.Parameter == "123456"; //并且Authorization参数为123456则验证通过 if (!verifyResult) { //如果验证欠亨过,则返回401错误,并且Body中写入错误原因 actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized,new HttpError("Token 不正确")); } } }

一个简单的用于用户验证的Filter就开发完了,这个Filter要求用户的请求中带有Authorization头并且参数为123456,如果通过则放行,欠亨过则返回401错误,并在Content中提示Token不正确。下面,我们需要注册这个Filter,注册Filter有三种要领:

第一种:在我们但愿进行权限控制的Action上打上AuthFilterAttribute这个Attribute:

public class PersonController : ApiController { [AuthFilter] public CreateResult Post(CreateUser user) { return new CreateResult() {Id = "123"}; } }

这种方法适合单个Action的权限控制。

第二种,找到相应的Controller,并打上这个Attribute:

[AuthFilter] public class PersonController : ApiController { public CreateResult Post(CreateUser user) { return new CreateResult() {Id = "123"}; } }

这种方法适合于控制整个Controller,打上这个Attribute以后,整个Controller里所有Action都获得了权限控制。

第三种,找到App_Start\WebApiConfig.cs,在Register要领下插手Filter实例:

public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes();    //注册全局Filter config.Filters.Add(new AuthFilterAttribute()); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }

用这种方法适合于控制所有的API,任意Controller和任意Action都接受了这个权限控制。

在大大都场景中,每个API的权限验证逻辑都是一样的,在这样的前提下使用全局注册Filter的要领最为简单便捷,可这样存在一个显而易见的问题:如果某几个API是不需要控制的(例如登录)怎么办?我们可以在这样的API上做这样的措置惩罚惩罚: