前言
上一篇文章分享了授权过滤器实现JWT进行鉴权,文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,接下来将用操作过滤器实现昨天的JWT鉴权。
一、什么是操作过滤器?
与授权过滤器大部分一样,只是执行的时机和继承的接口有所不同。操作过滤器是在Action执行的前和后进行调用执行。而不是像授权过滤器一样,在刚开上来就执行授权过滤器。操作过滤器的实现了是 IAsyncActionFilter 或 IActionFilter 接口。.

二、操作过滤器实现
操作过滤器重新定义Filter:
继承类Attribute, 接口MyAuthorizeFilterAttribute ,然后实现接口OnActionExecuted方法和OnActionExecuting方法,提供更多的对Action执行处理方法。此处在Action执行时书写自定义业务逻辑。
/// <summary>/// 授权过滤器/// </summary>public class MyAuthorizeFilterAttribute : Attribute, IActionFilter{#region IActionFilter 操作过滤器实现/// <summary>/// Action执行后/// </summary>/// <param name="context"></param>public void OnActionExecuted(ActionExecutedContext context){}/// <summary>/// Action执行前/// </summary>/// <param name="context"></param>public void OnActionExecuting(ActionExecutingContext context){var authHeader = context.HttpContext.Request.Headers["Authorization"];if (string.IsNullOrWhiteSpace(authHeader)){//var json = JsonConvert.SerializeObject(new OperationResult(OperationResultType.Error, "保存失败"));//此接口必须携带token访问!context.Result = new ContentResult(){Content = "此接口必须携带token访问,请登录携带Token访问",ContentType = "text/html"//application/json};}else //字段值不为空{authHeader = authHeader.ToString().Replace("Bearer", "").Trim();//去掉Bearer字串if (authHeader == ""){context.Result = new ContentResult(){Content = "token验证失败:您没有权限调用此接口,请登录重新获取Token",ContentType = "text/html"};}else{LoginUserInfo LoginInfo = JwtHelper.GetJwtDecode(authHeader);string UserName = LoginInfo.username;string PassWord = LoginInfo.pwd;double ExpireTimeStamp = LoginInfo.exp;if (isTokenExpire(ExpireTimeStamp)) //这里应该验证有效期{//token验证失败:您没有权限调用此接口,请登录获取Tokencontext.Result = new ContentResult(){Content = "token验证失败:您没有权限调用此接口,请登录重新获取Token",ContentType = "text/html"};}}}}#endregion/// <summary>/// 时间戳字符串/// </summary>/// <param name="timestamp"></param>/// <returns></returns>private bool isTokenExpire(double timestamp){try{System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));//当地时区var expireTime = startTime.AddSeconds(timestamp);if (expireTime > DateTime.Now){return false;//未过期}else{return true;//已过期}}catch (Exception ex){return true;}}}
其他实现代码和上篇保持一致:
三、验证:
操作过滤器实现的接口部分代码没有改动,只改动过滤器的书写,所以和上篇测试验证方法一致。
未授权访问:
不携带Token访问:

授权访问:

