JWT【分布式鉴权方案】
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JWT【分布式鉴权方案】相关的知识,希望对你有一定的参考价值。
参考技术A一、token在header中的传输规范
二、uuid在header中的传输规范
三、防重放攻击传输规范:
四、权限校验失败返回值
http status:401
逻辑说明
一、当用户需要登录时,客户端引导用户进行登录
二、登录发送用户名及密码至认证服务(passport)
三、认证服务验证用户名及密码,如果通过,通过jwt工具生成token
四、将生成的token写入redis
五、返回token
1、客户端请求api
2、获取token
3、解析token
4、由redis中读取token
5、验证token
6、注入权限
当用户遭禁时,该用户应如果已经登录,也该立刻被禁止访问。
难点在于禁用操作无法操作已经登录的客户端
如果将已禁用的用户标识在redis中,每次访问都要读取这个reids,但这个总体来讲是小概率事件,影响性能了。
比较好的办法是:在每个app示例中存储一份被禁用户名单,当禁用操作发生时,通知所有运行的示例。
这个思路采用redis订阅事件:
1、客户端请求api
2、获取token
3、解析token
4、由redis中读取token
5、验证token
6、刷新token
.NET Core5.0 JWT鉴权SSO单点登录
参考技术A JWT全称“JSON Web Token”,是基于JSON的用户身份认证的令牌。可跨域身份认证,所以JWT很适合做分布式的鉴权,单点登录(SingleSign,SSO)。jwt有三部分组成用符号"."隔开,
HEADER:token头,描述token是什么类型,加密方式是什么,把json内容转为base64
PAYLOAD:内容,是暴露出来的信息,不可存敏感信息,把json内容转为base64
SIGNATURE:签名,按token头的加密方式把HEADER和PAYLOAD的信息加密生成签名,下面是官网上面的介绍,地址: https://jwt.io/
jwt的token是不可以篡改的,虽然前两部分的内容可以base64解码之后就能看到明文,但由于第三部分签名是把前两部分内容用一个密钥加密的,验证的时候也是把前两部分内容再次加密和原来签名对比是否一致,若内容被篡改了,则两次签名不一致校验不通过。
问题一:同一个公司的系统 ,不如果每个系统都有一套自己的用户名密码,那用户记
得头都大了啊。所以这时产生了一个鉴权中心,全部系统用同一套用户信息,同一个地方登录。
问题二:用同一套用户信息可以了,但如果进每个系统都要输一次账户密码登录还是很麻烦的。所以这里还要一处登录 ,处处登录,登录了其中一个系统,进入其它系统的时候不需要登录
效果如下图所示
用户在sso中心登录后的token在站点A,站点B都能使用,并且站点A,站点B和sso中心不需要通讯也能自己鉴别token是否是有效的。
怎么做到站点和sso串联呢?具体的流程是用户打开站点A,发现未登录 ,那站点A会跳转到sso中心登录并且把自己的url带上,sso中心登录成功后,跳转回站点带过来的url并把token也带上。
那站点A登录成功了,站点B怎么共享这个Token呢,做法是,sso中心登录成功的时候同时存一份Token到cookie(或localstorage等地方),当用户进入站点B的时候,发现没登录,跳转到sso中心带上自己的url,sso中心发现cookie有token了,直接跳转回站点B的url并把token带上,这样站点B就能实现token共享和自动登录了。
新建一个AuthenticationCenter项目
新建一个AuthenticatinController控制器
Login的view视图
其它相关类
上面sso的登录功能就完成了,打开Login页面就能获取到Token了。
新建一个站点A
修改startup.cs文件,在ConfigureServices方法里加上
在Configure方法里加上
新建一个UserController
其它相关类
密钥要和sso中心的保持一致,上面的5000端口是sso的端口,27271端口是站点端口。
以上是关于JWT【分布式鉴权方案】的主要内容,如果未能解决你的问题,请参考以下文章