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

  • 操作过滤器—MVC中使用操作过滤器实现JWT权限认证已关闭评论
  • 166 次浏览
  • A+
所属分类:.NET技术
摘要

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


前言

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

一、什么是操作过滤器?

​ 与授权过滤器大部分一样,只是执行的时机和继承的接口有所不同。操作过滤器是在Action执行的前和后进行调用执行。而不是像授权过滤器一样,在刚开上来就执行授权过滤器。操作过滤器的实现了是 IAsyncActionFilterIActionFilter 接口。
操作过滤器—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权限认证

建群声明:本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!
操作过滤器—MVC中使用操作过滤器实现JWT权限认证