(1)共享Session
将用户认证信息保存在Session中,即以Session内存储的值为用户凭证。
解决方案:使用基于Redis的Session共享方案,将Session存储在Redis上,将整个系统的全局Cookie Domain设置于顶级域名上,这样SessionID就能在各个子系统间共享。
存在限制:
1.Session中所涉及的类型必须是子系统中共同拥有的。
2.跨顶级域名的情况完全无法处理。
(2)基于OpenId的单点登录
将用户的身份标识信息简化为OpenId存放在客户端,当用户登录某个子系统时,将OpenId传送到服务端,服务端根据OpenId构造用户验证信息,多用于C/S与B/S相结合的系统。
1.当用户第一次登陆时,将用户名密码发给验证服务;
2.验证服务将用户标识OpenId返回到客户端;
3.客户端进行存储;
4.访问子系统时,将OpenId发送到子系统;
5.子系统将OpenId转发到验证服务;
6.验证服务将用户认证信息返回到子系统;
7.子系统构建用户验证信息后将授权后的内容返回给客户端。
(3)基于Cookie的OpenId存储
1.在提供验证服务的站点里登录;
2.将OpenId写入顶级域名Cookie里;
3.访问子系统(cookie带有OpenId);
4.子系统取出OpenId通过验证服务发送OpenId;
5.返回用户认证信息;
6.返回授权后的内容。
和共享Session方案相比,用OpenId解耦了Session中所涉及的身份类型必须是子系统中共同拥有的缺陷。
(4)B/S多域名环境下的单点登录处理
1.用户通过登录子系统进行用户登录;
2.用户登录子系统记录了用户的登录状态、OpenId等信息;
3.用户使用业务子系统;
4.若用户未登录业务子系统则将用户跳转至用户登录子系统;
5.用户子系统通过JSONP接口将用户OpenId传给业务子系统;
6.业务子系统通过OpenId调用验证服务;
7.验证服务返回认证信息、业务子系统构造用户登录凭证;(此时用户客户端已经与子业务系统的验证信息已经一一对应)
8.将用户登录结果返回用户登录子系统,若成功登录则将用户跳转回业务子系统;
9.将授权后的内容返回客户端;
(5)安全问题
采用单用户多OpenId的解决方案,每次用户通过用户名/密码登陆时,产生一个OpenId保存在Redis里,并且设定过期时间,这样多个终端登录就会有多个OpenId与之对应,不再会存在一个OpenId失效所有终端验证都失效的情况。
12.单点登录的实现原理
最新推荐文章于 2023-06-12 14:31:56 发布