手写AspNetCore 认证授权代码
在普通的MVC项目中 我们普遍的使用Cookie来作为认证授权方式,使用简单。登录成功后将用户信息写入Cookie;但当我们做WebApi的时候显然Cookie这种方式就有点不适用了。
在dotnet core 中 WebApi中目前比较流行的认证授权方式是Jwt (Json Web Token) 技术。Jwt 是一种无状态的分布式身份验证方式,Jwt 是将用户登录信息加密后存放到返回的Token中 ,相当于用户信息是存储在客户端。Jwt的加密方式有两种 :对称加密与非对称加密,非对称加密即 RSA 加密的方式。
自己手写认证授权代码和Jwt的思路是一样的;不同之处在于:
1、加密方式仅仅是采用的对称加密方式 简单高效。哈哈!(弊端就是没有非对称加密更安全);
2、用户登录信息主要保存在Redis中,即服务端。
自己写的好处:
1、扩展性强,可根据自己的需要进行各种扩展,比如在验证授权时可很方便的添加多设备登录挤下线功能等。
2、可随时调整用户的Token失效时间。
认证及授权流程
1、先请求登录接口,登录成功,为用户产生一个Token,
登录获取Token 图片中ticket字段。
2、 客户端拿到Token在其他请求中将Token信息添加到请求头中传递到服务端。
开发思路
1、添加一个过滤器。在Startup 中ConfigureServices方法里添加一个Filters 即我们自己授权代码类。
添加过滤器之后我们的每次请求都会优先执行过滤器的代码。在这里我们就可以判断用户是否已经登录,从而进行拦截没有授权的的请求。
2、登录并获取Token
由于添加了IAuthorizationFilter类型的过滤器,所以每个请求都会被拦截。所以登录接口我们需要允许匿名访问。
3、加解密Token
加密:登录成功后就要产生个Token了,产生也简单。将用户的唯一信息比如uid或者guid进行对称式加密。当然如果需要对登录设备做区分或者多设备登录挤下线功能时最好也将登录设备一起加密进去。
我们都知道 在加密中一般情况下只要加密的数据及加密key不变;那么加密后的内容也会一直保持不变。如果我们每次登录产生的Token一直没有任何变化只要这个Token被泄露了那将很危险的。竟然我们希望每次登录产生的Token都有变化。那就要改变加密数据或者加密key了。加密数据是用户唯一信息这个显然不可能产生变化。所以我们能改变的地方只能是加密key了;我们采用固定key+随机key的方式。
因为加密key在我们解密时也是需要一一对应的。所以我们得想办法将我们的随机key告诉我们解密的代码中。办法就是 我们将加密后的内容(一般情况进行base64编码)再加上随机key。(随机key一定是固定长度 不然后面无法解析拆分)
比如加密内容是guid=73e01eab-210d-4d19-a72a-d0d64e053ec0+client=ios 固定key=123654+随机key=FEZaaWbyimaWiJHah
即加密过程:
加密(73e01eab-210d-4d19-a72a-d0d64e053ec0&ios,123654FEZaaWbyimaWiJHah)=M0EzM0ZGRjk2QzgwRDY2RDJDMTdFOEJGRUE0NDI3NEE1RDlFNkU4NDQ0MERFNEIyMkQ5QjM4MjAxODcwj加随机keyFEZaaWbyimaWiJHah
所以我们返回给用户的Token实际上是包含了随机key的。当然这个随机key只有我们自己知道。因为随机key的长度以及位置只有我们自己知道。这种方式即使我们固定key被泄露了 只要别人不知道我们随机key处理方法也无济于事。
解密:知道加密过程后就好解密了。拿到用户提交的Token后首先按照随机key的固定位置进行截取。将加密内容和随机key拆开。然后将固定key和随机key组合一起解密加密的内容,取得用户guid和登录的客户端类型。
完整加解密代码
代码中的ticket代表本文中的Token。代码中使用的是DES加解密
完整demo代码请看github
https://github.com/cfan1236/NetCoreAuthorize
原文地址:https://www.cnblogs.com/rui1236/p/10226063.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
手写AspNetCore 认证授权代码相关推荐
- siamese网络_CVPR 2019手写签名认证的逆鉴别网络
点击我爱计算机视觉标星,更快获取CVML新技术 本文简要介绍CVPR2019论文"Inverse Discriminative Networks for Handwritten Signat ...
- CVPR 2019|手写签名认证的逆鉴别网络
点击我爱计算机视觉标星,更快获取CVML新技术 本文简要介绍CVPR2019论文"Inverse Discriminative Networks for Handwritten Signat ...
- 四、用简单神经网络识别手写数字(内含代码详解及订正)
本博客主要内容为图书<神经网络与深度学习>和National Taiwan University (NTU)林轩田老师的<Machine Learning>的学习笔记,因此在全 ...
- 手写数字识别项目代码——卷积神经网络LeNet-5模型
''' #2018-06-25 272015 June Monday the 26 week, the 176 day SZ 手写字体识别程序文件1: 这个程序使用了卷积神经网络LeNet - 5模型 ...
- 手写数字识别全部代码--全连接神经网络方法
''' #2018-06-25 272015 June Monday the 26 week, the 176 day SZ 手写字体识别程序文件1: 这个程序使用了全连接神经网络也就是DNN. 定义 ...
- 【JS 纯手写轮播图代码】
轮播图实现 首先需要在同级目录下创建img文件夹,用以储存你需要轮播的图片,注意设置好图片的宽度,以免出现空白区域.然后就可以愉快地实现轮播功能啦~ // An highlighted block & ...
- 基于CNN的MINIST手写数字识别项目代码以及原理详解
文章目录 项目简介 项目下载地址 项目开发软件环境 项目开发硬件环境 前言 一.数据加载的作用 二.Pytorch进行数据加载所需工具 2.1 Dataset 2.2 Dataloader 2.3 T ...
- 小程序-手写签名(附代码)
方法不是我自己写的,但是也忘记最初的原版出自于哪里了,不过搜索下来就是大同小异,我就附上自己实测有效的!可以直接拿了用,只不过最后保存手写签名图片的方法自己写就可以了,用的就是小程序的图片上传方法. ...
- 【图像识别】基于卷积神经网络CNN手写数字识别matlab代码
1 简介 针对传统手写数字的随机性,无规律性等问题,为了提高手写数字识别的检测准确性,本文在研究手写数字区域特点的基础上,提出了一种新的手写数字识别检测方法.首先,对采集的手写数字图像进行预处理,由于 ...
最新文章
- Rust语言开发基础(六)基础语法
- 基于矩阵分解的推荐算法
- 编程之美-俄罗斯方块游戏方法整理
- jrockit_JRockit JRCMD教程
- 边缘检测robert原理_在操作机器视觉检测过程中,遇到检测精度的难题怎么办?_西旺科技...
- 阿里矢量图iconfont的两种使用方法
- SDN实验(三)——集线器hub的实现
- 微信小程序设置单个页面自定义头部为背景图
- matlab 内存不足
- 2021-2027全球与中国CMF电池市场现状及未来发展趋势
- 分享解决方法:为什么QQ聊天框中无法使用输入法输入中文?
- 无人机飞控技术-市场现状及未来发展趋势
- 58同城自动登录功能 分享给大家!
- windows7计算机无法到达,win7电脑突然无法进入到安全模式了怎么办?
- 计算机应用基础试题操作题,计算机应用基础期末考试操作题.doc
- modprobe XXX not found 解决与Depmod命令; insmod/modprobe的区别
- 抗体的N端或C端进行修饰ADC偶联物的过程-瑞禧
- 数据化运营chapter3_code--数据处理
- 王换招计算机组成与设计课件,计算机基础知识(课件)..ppt
- 市场经济下的“按劳分配”