子曰:工欲善其事,必先利其器

github:https://github.com/redAntCpp/CSharpTools

紧接上篇,上篇只是实现了token的生成以及解析,顺便提到了验证机制。但是在实际业务中,通常需要对token进行时效性验证。就像去看电影,电影票当天有效,必须在有效期内进行使用,否则就需要重新买票。

token时效验证

总体思路

第一步中,有个代码:

 if (isAPIUser(UserName, PassWord)){//这里应该验证有效期,暂时没写,后续提供思路return true;}

这里应该加上时效验证。那么如何实现token的时效性验证呢,这里提供两个思路:

思路1

  1. 设置一个有效期,让客户端每次调用服务时,带上第一次获取token的时间戳(加密)。
  2. 服务端取到这个时间后,进行解密,然后加上有效期,对比当前服务器的时间,大于则有效,小于则失效,

在IsAuthorized加上这一段即可

string requestTime = httpContext.Request.Headers["rtime"]; //请求时间经过DESC签名,头文件if (string.IsNullOrEmpty(requestTime))return false;DateTime Requestdt = DateTime.Parse(Decrypt.RSADecrypt(PrivateKey,requestTime)).AddMinutes(int.Parse(TimeStamp));DateTime Newdt = DateTime.Now; //服务器接收请求的当前时间if (Requestdt < Newdt) //token已过期{ErrorMessage = "token已过期,请重新获取";return false;}

思路2

  1. 当客户端获取token时,服务端记录获取token的时间与用户。
  2. 每当客户使用服务进入验证环节时,取出步骤1中的时间与用户id,加上有效期。
  3. 判断加上有效期后的时间与服务器的时间大小。

两个思路的区别在于谁记录token时间,当然安全性肯定是思路2更安全。因为,如果客户不按要求进行传时间,那么服务端是无法验证的。但是思路2也有弊端,每次都记录用户的token,存储空间消耗大,而且查询速度也会影响token验证速度。如果存放在数据库上,连接数据库的网速也是个需要考虑的问题。
两种方法各有利弊。
现在分享一下本人的思路2的一个改进方法,使用sqlite来进行token的存储,关于sqlite参考:私人工具集5——C#数据库操作类(DBHelper)
sqlite可以存储在本地,不用考虑网络问题,且结构简单,体积小,非常适合这种记录日志。

实现

  1. 创建SQLite本地表,T_APIUser,用来记录用户信息,字段参考如下:
  2. 创建本地表,T_TokenTrace,用来记录token生成时间以及状态。
  3. 在过滤器中,修改判断逻辑,如果用户验证通过,那么就获取最后一次该用户获取token的时间,并加上有效期,与现在时间比较。
                    if (APIUserID != -1){//验证有效期string TokenCreateTime = getTokenCreateTime(APIUserID);DateTime Requestdt = DateTime.Parse(TokenCreateTime).AddMinutes(int.Parse(TimeStamp));if (Requestdt < DateTime.Now){ErrorMessage = "token已过期,请重新获取";return false;}else{return true;}}
  1. . 这里补充一下辅助方法:
 //辅助方法//验证账号密码private int isAPIUser(string UserNo, string PassWord){Log.AddInfo("APIFilter.isAPIUser()", "Begin");string sqlstr = "SELECT APIUserID FROM T_APIUser where UserNo = @UserNo and PassWord = @PassWord";SQLiteParameter[] par = {new SQLiteParameter("@UserNo", UserNo),new SQLiteParameter("@PassWord",PassWord)};DataSet qry = site.SelectData(sqlstr, par);if (qry.Tables.Count == 1 && qry.Tables[0].Rows.Count == 0){Log.AddError("APIFilter.isAPIUser()", "APIUser账号不存在");return -1;}else{Log.AddInfo("APIFilter.isAPIUser()", "End");return Convert.ToInt32(qry.Tables[0].Rows[0]["APIUserID"].ToString());}}private string getTokenCreateTime(int APIUserID){string sqlStr = "SELECT CreateTime FROM T_TokenTrace where APIUserID = @APIUserID ORDER BY TokenTraceID  DESC LIMIT 1";SQLiteParameter[] par = {new SQLiteParameter("@APIUserID", APIUserID),};DataSet qry = site.SelectData(sqlStr, par);return qry.Tables[0].Rows[0]["CreateTime"].ToString();}

这样就可以简单实现token的有效期验证了。

实际演练

  1. 获取token接口
  2. 在原来的token控制器中,加上一个测试用的接口,并加上我们的过滤器,程序会按顺序向下执行。
  3. 设置有效期为2分钟。我这边读取的是json中的配置:
  4. 验证token有效期内,接口是否能正常访问:
  5. 2分钟后再次调用此接口:

其他拓展

token一般每次都不一样,token的值跟加密的key相关,不同的key会产生不同的token。因此,如果想要每次获取的token都不一样,我们可以在配置key的时候,随机生成一个字符串作为key,用于保证token的随机性。要实现此功能,则不宜在配置文件中写入了,因为配置文件通常不进行修改。
在此就不再深入讨论。

私人工具集7——webapi中的Token时效性验证相关推荐

  1. webapi中使用token验证(JWT验证)

    转自:https://www.cnblogs.com/ye-hcj/articles/8151385.html 本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.Ide ...

  2. vue+node.js前后端交互中的token令牌验证

    这篇文章分享一下本人学习vue+node.js前后端交互中的登录token令牌的心得 最近准备写一个个人博客网站,前端采用的是vue+element,后端用node.js 在做用户登录的时候就想到 如 ...

  3. 空间统计--空间关系建模工具集,Modeling Spatial Relationships

     Generate Network Spatial Weights 工具简介 该工具会根据网络的连通性来确定要素之间的权重关系,生成一个空间权重矩阵文件(swm).如在计算两点距离时,如果两点之间 ...

  4. jwt生成token和验证token以及获取playload的数据,实现token拦截

    jwt实现流程: 1.添加依赖: <dependency><groupId>com.auth0</groupId><artifactId>java-jw ...

  5. 计算机应用基础中什么是桌面,福师《计算机应用基础》在线作业二 Windows中进行系统设置的工具集是 用户可以根据自己的爱好更改显示器 键盘 鼠标器 桌面等硬件的设置...

    福师<计算机应用基础>在线作业二 Windows中进行系统设置的工具集是 用户可以根据自己的爱好更改显示器 键盘 鼠标器 桌面等硬件的设置 (12页) 本资源提供全文预览,点击全文预览即可 ...

  6. 计算机视觉 AI 工具集 OpenVINO™,是你心目中的深度学习框架 Top1 吗?

    再牛的硬件设施,没有好用顺手的软件工具加持也是把没开刃的刀. 这条准则在所有技术领域皆准,包括人工智能领域发展最成熟.落地最广泛的计算机视觉.AI芯片使得计算机视觉技术得以在现实生活中落地,为了更加充 ...

  7. ArcGIS中各版本ArcMap安装OpenStreetMap编辑工具集插件ArcGIS Editor for OSM

      本文介绍ArcGIS Editor for OpenStreetMap工具集插件的下载与安装方法.ArcGIS Editor for OpenStreetMap是ArcMap软件中的一个工具集,通 ...

  8. Winform宿主Asp.Net WebApi中Owin 自定义Token请求参数

    本文介绍的是Winform宿主Asp.net WebAPI的过程,利用了Microsoft.AspNet.WebApi.OwinSelfHost. Asp.NET WebAPI中的授权验证有很多: 例 ...

  9. 导航、开源镜像、Prompt ( AI 提示词 )、AI工具集、chatgpt镜像

    1.导航 网站 众多网址导航中,哪个最好?理由是什么? :https://www.zhihu.com/question/19899559 除了百度,其他搜索引擎: 综合类搜索导航(Anywhere A ...

最新文章

  1. 重装IE后,ASP.NET无法按F5启动项目的解决方法
  2. 自2018年以来我不知道的事情-Dan Abramov
  3. 解决导航守卫router.beforeResolve使用不了this.$store
  4. 安卓进阶系列-05列表控件(RecyclerView)的使用
  5. 如何实现点击微信内置浏览器返回按钮,返回指定页面,或者原地刷新
  6. Mac 使用Eigen库
  7. 4.线性和卷积——边界问题、解决边界方法和Matlab实战_3
  8. 单源最短路(spfa+Dijkstra)附数据
  9. Linux中bond的七种网卡绑定模式详解
  10. 简账(开源记账软件)-后端环境简介及部署
  11. CodeSmith(C#)简单示例及相关小知识
  12. 在Virtualbox虚拟机中安装MSDOS(简易教程)
  13. AES加密报错Given final block not properly padded
  14. harmonyos下载,harmonyos 2.0下载
  15. 2022数学建模国赛ABC题思路
  16. 洁净厂房洁净度等级SICOLAB
  17. 线上tomcat服务器假死排查
  18. Datadog 能成为最大的云监控厂商吗
  19. 元学习兴起,卷积“落幕” | NeurIPS2020研究趋势总结
  20. Kubeadm初始化报错

热门文章

  1. java-net-php-python-springboot网上书城项目计算机毕业设计程序
  2. 【读书笔记】:cs231n(image classification notes)
  3. 反欺诈体系与设备指纹
  4. 一文看懂设备指纹如何防篡改、防劫持
  5. Capsule Networks胶囊网络(一)
  6. 智慧旅游垂直入口__游侃天下(一)
  7. 【java】java定时任务1秒调度一次会怎么样
  8. 5GMM和EMM service request介绍
  9. CUDA编程时遇到无法解析外部符号threadIdx或blockIdx问题的解决办法
  10. TCP三次握手和四次挥手详解(面试常见问题)