翼度科技»论坛 编程开发 .net 查看内容

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

11

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
前言

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

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

二、操作过滤器实现

操作过滤器重新定义Filter:

继承类Attribute, 接口MyAuthorizeFilterAttribute ,然后实现接口OnActionExecuted方法和OnActionExecuting方法,提供更多的对Action执行处理方法。此处在Action执行时书写自定义业务逻辑。
  1. /// <summary>
  2.     /// 授权过滤器
  3.     /// </summary>
  4.     public class MyAuthorizeFilterAttribute : Attribute, IActionFilter
  5.     {
  6.        #region IActionFilter 操作过滤器实现
  7.         /// <summary>
  8.         /// Action执行后
  9.         /// </summary>
  10.         /// <param name="context"></param>
  11.         public void OnActionExecuted(ActionExecutedContext context)
  12.         {
  13.         }
  14.         /// <summary>
  15.         /// Action执行前
  16.         /// </summary>
  17.         /// <param name="context"></param>
  18.         public void OnActionExecuting(ActionExecutingContext context)
  19.         {
  20.             var authHeader = context.HttpContext.Request.Headers["Authorization"];
  21.             if (string.IsNullOrWhiteSpace(authHeader))
  22.             {
  23.                 //var json =  JsonConvert.SerializeObject(new OperationResult(OperationResultType.Error, "保存失败"));
  24.                 //此接口必须携带token访问!
  25.                 context.Result = new ContentResult()
  26.                 {
  27.                     Content = "此接口必须携带token访问,请登录携带Token访问",
  28.                     ContentType = "text/html"//application/json
  29.                 };
  30.             }
  31.             else //字段值不为空
  32.             {
  33.                 authHeader = authHeader.ToString().Replace("Bearer", "").Trim();//去掉Bearer字串
  34.                 if (authHeader == "")
  35.                 {
  36.                     context.Result = new ContentResult()
  37.                     {
  38.                         Content = "token验证失败:您没有权限调用此接口,请登录重新获取Token",
  39.                         ContentType = "text/html"
  40.                     };
  41.                 }
  42.                 else
  43.                 {
  44.                     LoginUserInfo LoginInfo = JwtHelper.GetJwtDecode(authHeader);
  45.                     string UserName = LoginInfo.username;
  46.                     string PassWord = LoginInfo.pwd;
  47.                     double ExpireTimeStamp = LoginInfo.exp;
  48.                     if (isTokenExpire(ExpireTimeStamp)) //这里应该验证有效期
  49.                     {
  50.                         //token验证失败:您没有权限调用此接口,请登录获取Token
  51.                         context.Result = new ContentResult()
  52.                         {
  53.                             Content = "token验证失败:您没有权限调用此接口,请登录重新获取Token",
  54.                             ContentType = "text/html"
  55.                         };
  56.                     }
  57.                 }
  58.             }
  59.         }
  60.         #endregion
  61.         /// <summary>
  62.         /// 时间戳字符串
  63.         /// </summary>
  64.         /// <param name="timestamp"></param>
  65.         /// <returns></returns>
  66.         private bool isTokenExpire(double timestamp)
  67.         {
  68.             try
  69.             {
  70.                 System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));//当地时区
  71.                 var expireTime = startTime.AddSeconds(timestamp);
  72.                 if (expireTime > DateTime.Now)
  73.                 {
  74.                     return false;//未过期
  75.                 }
  76.                 else
  77.                 {
  78.                     return true;//已过期
  79.                 }
  80.             }
  81.             catch (Exception ex)
  82.             {
  83.                 return true;
  84.             }
  85.         }
  86.     }
复制代码
其他实现代码和上篇保持一致:

三、验证:

​    操作过滤器实现的接口部分代码没有改动,只改动过滤器的书写,所以和上篇测试验证方法一致。
未授权访问:

不携带Token访问:

授权访问:

获取Token:

携带Token访问:

建群声明:本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!


来源:https://www.cnblogs.com/wml-it/archive/2023/08/11/17622162.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具