聊一聊Asp.net过滤器Filter那一些事
/// <summary> /// MVC自界说授权 /// 认证授权有两个重写要领 /// 详细的认证逻辑实现:AuthorizeCore 这个内里写详细的认证逻辑,认证乐成返回true,反之返回false /// 认证失败处理赏罚逻辑:HandleUnauthorizedRequest 前一步返回 false时,就会执行到该要领中 /// 可是,我平常在应用进程中,一样平常都是在AuthorizeCore按照差异的认证功效,直接做认证后的逻辑处理赏罚 /// </summary> public class XYHMVCAuthorizeAttribute : AuthorizeAttribute { /// <summary> /// 认证逻辑 /// </summary> /// <param>过滤器上下文</param> public override void OnAuthorization(AuthorizationContext filterContext) { // 此处首要写认证授权的相干验证逻辑 // 该部门的验证一样平常包罗两个部门 // 登录权限校验 // --我们的一样平常处理赏罚方法是,通过header中转达一个token来举办逻辑验证 // --虽然差异的体系在计划上也不尽沟通,有的也会回收session等方法来验证 // --以是最终照旧按照其项目自己的现实环境来举办对应的逻辑操纵 // 详细的页面权限校验 // --该部门的验证是详细的到页面权限验证 // --我看有得小搭档没有做到这一个水平,直接将这一步放在前端js来验证,这样不是很安详,可是可以拦住小白用户 // --虽然有的体系基础就没有做权限节制,那就更不必要这一个逻辑了。 // --以是最终照旧按照其项目自己的现实环境来举办对应的逻辑操纵 // 此刻用一个粗暴的方法来简朴模仿实现过,用体系当前时刻段秒厨艺3,取余数 // 当余数为0:认证授权通过 // 1:代表为登录,调解至登录页面 // 2:代表无会见权限,调解至无权限提醒页面 // 虽然,在这也还可以做一些IP白名单,IP黑名单验证 哀求频率验证等等 // 说到这而,尚有一点必要留意,假如我们选择的是全局注册该过滤器,那么假若有的页面基础不必要权限认证,好比登录页面,那么我们可以给不必要权限的认证的节制器可能action添加一个非凡的注解 AllowAnonymous ,来解除 // 获取Request的几个要害信息 HttpRequest httpRequest = HttpContext.Current.Request; string acitonName = filterContext.ActionDescriptor.ActionName; string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; // 留意:假如认证不通过,必要配置filterContext.Result的值,不然照旧会执行action中的逻辑 filterContext.Result = null; int thisSecond = System.DateTime.Now.Second; switch (thisSecond % 3) { case 0: // 认证授权通过 break; case 1: // 代表为登录,调解至登录页面 // 只有配置了Result才会终结操纵 filterContext.Result = new RedirectResult("/html/Login.html"); break; case 2: // 代表无会见权限,调解至无权限提醒页面 filterContext.Result = new RedirectResult("/html/NoAuth.html"); break; } } } ActionFilter:自界说过滤器 自界说过滤器,首要是监控action哀求前后,处理赏罚功效返回前后的变乱。个中API只有哀求前后的两个要领。
从头要领 要领成果描写 行使于 OnActionExecuting 一个哀求在进入到aciton逻辑前执行 MVC、API OnActionExecuted 一个哀求aciton逻辑执行后执行 MVC、API OnResultExecuting 对应的view视图渲染前执行 MVC OnResultExecuted 对应的view视图渲染后执行 MVC 在这几个要领中,我们一样平常首要用来记录交互日记,记录每一个步调的耗时环境,以便后续体系优化行使。详细的行使,按照自身的营业场景行使。 个中MVC和API的异同点,和上面说的认证授权的异同相同,不在具体声名。 下面的一个实例代码: API界说过滤器实例DEMO代码 /// <summary> /// Action过滤器 /// </summary> public class XYHAPICustomActionFilterAttribute : ActionFilterAttribute { /// <summary> /// Action执行开始 /// </summary> /// <param></param> public override void OnActionExecuting(HttpActionContext actionContext) { } /// <summary> /// action执行往后 /// </summary> /// <param></param> public override void OnActionExecuted(HttpActionExecutedContext actionContext) { try { // 构建一个日记数据模子 MApiRequestLogs apiRequestLogsM = new MApiRequestLogs(); // API名称 apiRequestLogsM.API = actionContext.Request.RequestUri.AbsolutePath; // apiKey apiRequestLogsM.API_KEY = HttpContext.Current.Request.QueryString["ApiKey"]; // IP地点 apiRequestLogsM.IP = FilterAttributeHelp.GetIPAddress(actionContext.Request); // 获取token string token = HttpContext.Current.Request.Headers.GetValues("Token") == null ? string.Empty : HttpContext.Current.Request.Headers.GetValues("Token")[0]; apiRequestLogsM.TOKEN = token; // URL apiRequestLogsM.URL = actionContext.Request.RequestUri.AbsoluteUri; // 返复书息 var objectContent = actionContext.Response.Content as ObjectContent; var returnValue = objectContent.Value; apiRequestLogsM.RESPONSE_INFOR = returnValue.ToString(); // 因为数据库中最大只能存储4000字符串,以是对返回值做一个截取 if (!string.IsNullOrEmpty(apiRequestLogsM.RESPONSE_INFOR) && apiRequestLogsM.RESPONSE_INFOR.Length > 4000) { apiRequestLogsM.RESPONSE_INFOR = apiRequestLogsM.RESPONSE_INFOR.Substring(0, 2000); } // 哀求参数 apiRequestLogsM.REQUEST_INFOR = actionContext.Request.RequestUri.Query; // 界说一个异步委托 ,异步记录日记 // Func<MApiRequestLogs, string> action = AddApiRequestLogs;//声明一个委托 // IAsyncResult ret = action.BeginInvoke(apiRequestLogsM, null, null); } catch (Exception ex) { } } } HandleError:错误处理赏罚 非常处理赏罚对付我们来说很常用,很好的操作非常处理赏罚,可以很好的停止全篇的try/catch。非常处理赏罚箱单很简朴,值必要自界说集成:ExceptionFilterAttribute,并自界说实现:OnException要领即可。 在OnException我们可以按照自身必要,做一些响应的逻辑处理赏罚,好比记录非常日记,便于后续题目说明跟进。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |