操作过滤器—MVC中使用操作过滤器实现JWT权限认证

前言

      上一篇文章分享了授权过滤器实现JWT进行鉴权,文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,接下来将用操作过滤器实现昨天的JWT鉴权。

一、什么是操作过滤器?

       与授权过滤器大部分一样,只是执行的时机和继承的接口有所不同。操作过滤器是在Action执行的前和后进行调用执行。而不是像授权过滤器一样,在刚开上来就执行授权过滤器。操作过滤器的实现了是 IAsyncActionFilter 或 IActionFilter 接口。.

操作过滤器—MVC中使用操作过滤器实现JWT权限认证

二、操作过滤器实现

操作过滤器重新定义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验证失败:您没有权限调用此接口,请登录获取Token                        context.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访问:

操作过滤器—MVC中使用操作过滤器实现JWT权限认证

授权访问:

获取Token:

操作过滤器—MVC中使用操作过滤器实现JWT权限认证

携带Token访问:

操作过滤器—MVC中使用操作过滤器实现JWT权限认证