私人工具集7——webapi中的Token时效性验证
子曰:工欲善其事,必先利其器
github:https://github.com/redAntCpp/CSharpTools
紧接上篇,上篇只是实现了token的生成以及解析,顺便提到了验证机制。但是在实际业务中,通常需要对token进行时效性验证。就像去看电影,电影票当天有效,必须在有效期内进行使用,否则就需要重新买票。
token时效验证
总体思路
第一步中,有个代码:
if (isAPIUser(UserName, PassWord)){//这里应该验证有效期,暂时没写,后续提供思路return true;}
这里应该加上时效验证。那么如何实现token的时效性验证呢,这里提供两个思路:
思路1
- 设置一个有效期,让客户端每次调用服务时,带上第一次获取token的时间戳(加密)。
- 服务端取到这个时间后,进行解密,然后加上有效期,对比当前服务器的时间,大于则有效,小于则失效,
在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
- 当客户端获取token时,服务端记录获取token的时间与用户。
- 每当客户使用服务进入验证环节时,取出步骤1中的时间与用户id,加上有效期。
- 判断加上有效期后的时间与服务器的时间大小。
两个思路的区别在于谁记录token时间,当然安全性肯定是思路2更安全。因为,如果客户不按要求进行传时间,那么服务端是无法验证的。但是思路2也有弊端,每次都记录用户的token,存储空间消耗大,而且查询速度也会影响token验证速度。如果存放在数据库上,连接数据库的网速也是个需要考虑的问题。
两种方法各有利弊。
现在分享一下本人的思路2的一个改进方法,使用sqlite来进行token的存储,关于sqlite参考:私人工具集5——C#数据库操作类(DBHelper)
sqlite可以存储在本地,不用考虑网络问题,且结构简单,体积小,非常适合这种记录日志。
实现
- 创建SQLite本地表,T_APIUser,用来记录用户信息,字段参考如下:
- 创建本地表,T_TokenTrace,用来记录token生成时间以及状态。
- 在过滤器中,修改判断逻辑,如果用户验证通过,那么就获取最后一次该用户获取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;}}
- . 这里补充一下辅助方法:
//辅助方法//验证账号密码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的有效期验证了。
实际演练
- 获取token接口
- 在原来的token控制器中,加上一个测试用的接口,并加上我们的过滤器,程序会按顺序向下执行。
- 设置有效期为2分钟。我这边读取的是json中的配置:
- 验证token有效期内,接口是否能正常访问:
- 2分钟后再次调用此接口:
其他拓展
token一般每次都不一样,token的值跟加密的key相关,不同的key会产生不同的token。因此,如果想要每次获取的token都不一样,我们可以在配置key的时候,随机生成一个字符串作为key,用于保证token的随机性。要实现此功能,则不宜在配置文件中写入了,因为配置文件通常不进行修改。
在此就不再深入讨论。
私人工具集7——webapi中的Token时效性验证相关推荐
- webapi中使用token验证(JWT验证)
转自:https://www.cnblogs.com/ye-hcj/articles/8151385.html 本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.Ide ...
- vue+node.js前后端交互中的token令牌验证
这篇文章分享一下本人学习vue+node.js前后端交互中的登录token令牌的心得 最近准备写一个个人博客网站,前端采用的是vue+element,后端用node.js 在做用户登录的时候就想到 如 ...
- 空间统计--空间关系建模工具集,Modeling Spatial Relationships
Generate Network Spatial Weights 工具简介 该工具会根据网络的连通性来确定要素之间的权重关系,生成一个空间权重矩阵文件(swm).如在计算两点距离时,如果两点之间 ...
- jwt生成token和验证token以及获取playload的数据,实现token拦截
jwt实现流程: 1.添加依赖: <dependency><groupId>com.auth0</groupId><artifactId>java-jw ...
- 计算机应用基础中什么是桌面,福师《计算机应用基础》在线作业二 Windows中进行系统设置的工具集是 用户可以根据自己的爱好更改显示器 键盘 鼠标器 桌面等硬件的设置...
福师<计算机应用基础>在线作业二 Windows中进行系统设置的工具集是 用户可以根据自己的爱好更改显示器 键盘 鼠标器 桌面等硬件的设置 (12页) 本资源提供全文预览,点击全文预览即可 ...
- 计算机视觉 AI 工具集 OpenVINO™,是你心目中的深度学习框架 Top1 吗?
再牛的硬件设施,没有好用顺手的软件工具加持也是把没开刃的刀. 这条准则在所有技术领域皆准,包括人工智能领域发展最成熟.落地最广泛的计算机视觉.AI芯片使得计算机视觉技术得以在现实生活中落地,为了更加充 ...
- ArcGIS中各版本ArcMap安装OpenStreetMap编辑工具集插件ArcGIS Editor for OSM
本文介绍ArcGIS Editor for OpenStreetMap工具集插件的下载与安装方法.ArcGIS Editor for OpenStreetMap是ArcMap软件中的一个工具集,通 ...
- Winform宿主Asp.Net WebApi中Owin 自定义Token请求参数
本文介绍的是Winform宿主Asp.net WebAPI的过程,利用了Microsoft.AspNet.WebApi.OwinSelfHost. Asp.NET WebAPI中的授权验证有很多: 例 ...
- 导航、开源镜像、Prompt ( AI 提示词 )、AI工具集、chatgpt镜像
1.导航 网站 众多网址导航中,哪个最好?理由是什么? :https://www.zhihu.com/question/19899559 除了百度,其他搜索引擎: 综合类搜索导航(Anywhere A ...
最新文章
- 重装IE后,ASP.NET无法按F5启动项目的解决方法
- 自2018年以来我不知道的事情-Dan Abramov
- 解决导航守卫router.beforeResolve使用不了this.$store
- 安卓进阶系列-05列表控件(RecyclerView)的使用
- 如何实现点击微信内置浏览器返回按钮,返回指定页面,或者原地刷新
- Mac 使用Eigen库
- 4.线性和卷积——边界问题、解决边界方法和Matlab实战_3
- 单源最短路(spfa+Dijkstra)附数据
- Linux中bond的七种网卡绑定模式详解
- 简账(开源记账软件)-后端环境简介及部署
- CodeSmith(C#)简单示例及相关小知识
- 在Virtualbox虚拟机中安装MSDOS(简易教程)
- AES加密报错Given final block not properly padded
- harmonyos下载,harmonyos 2.0下载
- 2022数学建模国赛ABC题思路
- 洁净厂房洁净度等级SICOLAB
- 线上tomcat服务器假死排查
- Datadog 能成为最大的云监控厂商吗
- 元学习兴起,卷积“落幕” | NeurIPS2020研究趋势总结
- Kubeadm初始化报错
热门文章
- java-net-php-python-springboot网上书城项目计算机毕业设计程序
- 【读书笔记】:cs231n(image classification notes)
- 反欺诈体系与设备指纹
- 一文看懂设备指纹如何防篡改、防劫持
- Capsule Networks胶囊网络(一)
- 智慧旅游垂直入口__游侃天下(一)
- 【java】java定时任务1秒调度一次会怎么样
- 5GMM和EMM service request介绍
- CUDA编程时遇到无法解析外部符号threadIdx或blockIdx问题的解决办法
- TCP三次握手和四次挥手详解(面试常见问题)