一、背景
系统用户登录,通过生成jwt 存储于cookie中,带入客户端,之后每次请求,cookie中带入登录态,实现单系统登录。当应用群过多的时,用户需要登录各个不同的系统群,这样便增大了用户的操作复杂度。因此当用户访问一个应用群时,应用群的复杂性由内部各个系统承担。,对用户而言都应该是一个整体应用,因此用户只需登录一次足矣。即:在多系统应用群中登录/注销一个系统,便可在其他系统中得到授权,而无需再次登录/注销。(单点登录与单点注销)。
二、单点登录介绍
1、 条件:
A、所有应用系统共享的一个身份认证信息。
B、所有应用系统能识别和提取的ticket凭证。
2、原理
A、同顶级域名下的单点登录:
服务器在用户登录之后,会将登录请求的cookie返回客户端,客户端在以后的每次请求时,带回服务端,服务端验证,返回请求体内容。生成cookie都会带有一个域,(domian),将domain设置为顶级域名,则在同等级域名下的系统,便可实现单点登录。
B、多顶级域名及无域名下的单点登录:
登录:单点登录需要一个认证中心支持,认证中心能够接受用户的登录信息等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权(token等认证令牌),当认证令牌没问题事下发令牌到子系统,子系统得到授权,创建与用户局部会话,登录子系统。登录成功之后,建立全局会话(认证中心及各个子系统建立会话)。@font-face{ font-family:"Times New Roman"; }
注销:在一个子系统中注销,所有子系统的会话都将被销毁
3、单点登录特点
A、减少用户在不同系统中登录耗费的时间,减少用户登录出错的可能性
B、实现安全的同时避免了处理和保存多套系统用户的认证信息;
C、减少了系统管理员增加、删除用户和修改用户权限的时间;
D、系统管理员有了更好的方法管理用户,包括可以通过直接禁止和删除用户来取消该用户对所有系统资源的访问权限
三、单点登录相关框架分析
1、微软passport: 集成身份认证
A、结构模型:

B、框架突出缺陷
a、用cookie在浏览器端保存加密用户信息,生存时间由浏览器时间决定,任一passport非法用户可利用保存在浏览器中的cookie进行非法操作。
b、passport作为多应用系统的认证服务器,认证开销全部集中在passport,随应用系统的扩张,认证性能会造成相应的瓶颈。
c、passport还存在自身安全性、集中时间段的大规模用户访问,黑客主动攻击等安全问题。
2、耶鲁CAS
A、结构模型:

B、框架突出缺陷,
a、下发ticket是通过路由参数传输,会存在一定的安全风险。如:xss,csrf等
b、下发客户端凭证通过cookie传输,保存了用户的登录信息,客户端cookie存储大小有限。
c、认证服务器只负责用户信息认证,及下发授权凭证Tickt,下发凭证时,是一个较为繁杂的过程,相对消耗性能。
注* ticket: 相关主要票据 TGT、ST、PGT、PGTIOU、PT,各个票据都有相应对应的作用。
四、单点登录方案拟定: JWT + SSO(passport)
1、流程构想


流程介绍:子系统A登录,通过认证服务器,如未登录,重定向至认证登录页,输入用户名密码,认证登录,认证服务器鉴权成功后,建立全局会话,生成登录凭证jwt,,设置过期时间,存储于客户端cookie,该系统拿到jwt,向认证服务器验证是否有效,有效则在cookie中当前系统登录凭证,设置子系统cookie中。当在该应用中访问其他子系统B时,在请求的地址参数中带入retrunUrl指向应用地址,设置登录页设置跨域cookie = jwt。子系统B从页面中获取jwt,向验证服务器验证jwt是否有效,有效则系统B下发当前登录凭证。注销时,系统A注销,认证服务器通过验证jwt合法,注销jwt,删除用户登录状态,重定向到登录页。
2、认证服务器: 选用passport,暂选用用户名密码策略。
3、外部系统接入条件:
提供资源: 跳转地址, 用户数据。
授权:jwt token信息, 及验证中间件,及授权相关接口。
用户数据同步到认证数据库(即当前应用系统用户表中),通过用户名建立用户对应关系。用户访问该系统的时,通过请求接口的方式进行认证,通过传输全局会话的方式建立局部会话,下发登录凭证。系统接入需说明登录凭证。
4、jwt token生成
Header :{alg:“256”,typ:”jwt”}
Payload:{
Username: fsddf,
userID:123312,
Exp: 300,
sysUrl: ‘访问系统连接’
Sysname: ‘访问系统名’
userAgent: ‘客户端浏览器信息’
}
Sig: 秘钥
5、问题点:
a、每个系统可能存在不同的用户数据,用户数据有可能没有关联。及创建子系统创建新用户。解决方案: 子系统创建用户,通过认证服务统一创建新用户。子系统已有用户,拉取该系统已有用户数据,创建指定权限用户。
b、各个子系统是否保留自身登录。
c、cookie安全问题及参数传递的安全问题。
d、验证信息,下发登录凭证,,验证凭证,都需验证服务器处理,当系统外接较多时用户体验,与性能问题。