聊一聊Asp.net过滤器Filter那一些事
副问题[/!--empirenews.page--]
最近在清算优化.net代码时,发明几个很不友爱的处理赏罚征象:登录判定、权限认证、日记记录、非常处理赏罚等通用操纵,在项目中的action中处处都是。在代码优化上,这一点是很重要出力点。这时.net中的过滤器、拦截器(Filter)就派上用场了。此刻按照这几天的现实事变,对其做了一个简朴的梳理,分享出来,以供各人参考交换,若有写的欠妥之处,多多指出,多多交换。 概述: .net中的Filter中首要包罗以下4大类:Authorize(授权),ActionFilter(自界说),HandleError(错误处理赏罚)。
过滤器 类名 实现接口 描写 授权 AuthorizeAttribute IAuthorizationFilter 此范例(或过滤器)用于限定进入节制器或节制器的某个举动要领,好比:登录、权限、会见节制等等 非常 HandleErrorAttribute IExceptionFilter 用于指定一个举动,这个被指定的举动处理赏罚某个举动要领或某个节制器内里抛出的非常,好比:全局非常同一处理赏罚。 自界说 ActionFilterAttribute IActionFilter和IResultFilter 用于进入举动之前或之后的处理赏罚或返回功效的之前或之后的处理赏罚,好比:用户哀求日记详情日记记录 AuthorizeAttribute:认证授权 认证授权首要是对全部action的会见第一进口认证,对用户的会见做第一道禁锢过滤拦截闸口。 实现方法:必要自界说一个类,担任AuthorizeAttribute并重写OnAuthorization,在OnAuthorization中可以或许获取到用户哀求的全部Request信息,着实我们做的全部认证拦截操纵,其全部数据支撑都是来自Request中。 详细验证流程计划: IP白名单:这个首要针对的是API做IP限定,只有指定IP才可会见,非指定IP直接返回 哀求频率节制:这个首要是节制用户的会见频率,首要是针对API做,超出哀求频坦率接返回。 登录认证:登录认证一样平常我们回收的是通过在哀求的header中转达token的方法来举办验证,这样纵然用与一样平常的MVC登录认证,也行使与API接口的Auth认证,而且也不依靠于用户前端js配置等。 授权认证:授权认证就简朴了,首要是验证该用户是否具有该权限,假如不具有,直接做下响应的返回处理赏罚。 MVC和API异同: 定名空间:MVC:System.Web.Http.Filters;API:System.Web.Mvc 注入方法:在注入方法上,首要包罗:全局->节制器Controller->举动Action 全局注册:针对全部体系的全部Aciton都行使 Controller:只针对该Controller下的Action起浸染 Action:只针对该Action起浸染 个中全局注册,针对MVC和API尚有一些差别: MVC在 FilterConfig.cs中注入 filters.Add(new XYHMVCAuthorizeAttribute()); API 在 WebApiConfig.cs 中注入 config.Filters.Add(new XYHAPIAuthorizeAttribute()); 留意事项:在现实行使中,针对认证授权,我们一样平常都是添加全局认证,可是,有的action又不必要做认证,好比原来的登录Action等等,那么该怎样解除呢?着实也很简朴,我们只必要在自定界说一个Attribute集成Attribute,可能体系的AllowAnonymousAttribute,在不必要验证的action中只必要注册上对付的Attribute,并在验证前做一个过滤即可,好比: // 有 AllowAnonymous 属性的接口直接开绿灯 if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()) { return; } API AuthFilterAttribute实例代码 /// <summary> /// 授权认证过滤器 /// </summary> public class XYHAPIAuthFilterAttribute : AuthorizationFilterAttribute { /// <summary> /// 认证授权验证 /// </summary> /// <param>哀求上下文</param> public override void OnAuthorization(HttpActionContext actionContext) { // 有 AllowAnonymous 属性的接口直接开绿灯 if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()) { return; } // 在哀求前做一层拦截,首要验证token的有用性和验签 HttpRequest httpRequest = HttpContext.Current.Request; // 获取apikey var apikey = httpRequest.QueryString["apikey"]; // 起首做IP白名单校验 MBaseResult<string> result = new AuthCheckService().CheckIpWhitelist(FilterAttributeHelp.GetIPAddress(actionContext.Request), apikey); // 检讨时刻搓 string timestamp = httpRequest.QueryString["Timestamp"]; if (result.Code == MResultCodeEnum.successCode) { // 检讨时刻搓 result = new AuthCheckService().CheckTimestamp(timestamp); } if (result.Code == MResultCodeEnum.successCode) { // 做哀求频率验证 string acitonName = actionContext.ActionDescriptor.ActionName; string controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName; result = new AuthCheckService().CheckRequestFrequency(apikey, $"api/{controllerName.ToLower()}/{acitonName.ToLower()}"); } if (result.Code == MResultCodeEnum.successCode) { // 署名校验 // 获取所有的哀求参数 Dictionary<string, string> queryParameters = httpRequest.GetAllQueryParameters(); result = new AuthCheckService().SignCheck(queryParameters, apikey); if (result.Code == MResultCodeEnum.successCode) { // 假若有NoChekokenFilterAttribute 标签 那么直接不做token认证 if (actionContext.ActionDescriptor.GetCustomAttributes<XYHAPINoChekokenFilterAttribute>().Any()) { return; } // 校验token的有用性 // 获取一个 token string token = httpRequest.Headers.GetValues("Token") == null ? string.Empty : httpRequest.Headers.GetValues("Token")[0]; result = new AuthCheckService().CheckToken(token, apikey, httpRequest.FilePath); } } // 输出 if (result.Code != MResultCodeEnum.successCode) { // 必然要实例化一个response,是否最终照旧会执行action中的代码 actionContext.Response = new HttpResponseMessage(HttpStatusCode.OK); //必要本身指定输出内容和范例 HttpContext.Current.Response.ContentType = "text/html;charset=utf-8"; HttpContext.Current.Response.Write(JsonConvert.SerializeObject(result)); HttpContext.Current.Response.End(); // 此处竣事相应,就不会走路由体系 } } } MVC AuthFilterAttribute实例代码 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |