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【分布式鉴权方案】的主要内容,如果未能解决你的问题,请参考以下文章

基于token的鉴权机制 — JWT介绍

.NET Core5.0 JWT鉴权SSO单点登录

分布式架构-API网关

微服务认证鉴权的四种方案

微服务架构下的鉴权,怎么做更优雅?

实现JWT鉴权机制