阅读背景:

【Spring Boot&& Spring Cloud系列】单点登录SSO概述

来源:互联网 

概念

单点登录(Singleton Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就能访问所有相互信任的应用系统。

也就是说在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录就能得到其他所有系统的信任。单点登录在大型网站中使用非常频繁,例如阿里这里的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户操作繁琐,各子系统重复认证授权也十分繁琐,因此实现单点登录说到底就是解决产生和存储信任,再就是其他系统验证信任的有效性。

实现方案

方案一、Cookie

原理:实现一次登录和一次退出,session是保持登录状态关键的东西,客户端持有ID,服务端持有session,两者一起用来保持登录状态。客户端需要用ID来作为凭证,二服务端需要用session来验证ID的有效性。但是不同的服务有自己的Session,因此要想办法让各个server共用session信息

缺陷:1、Cookie不安全(可以采取Cookie加密提高安全性)

 2、不能跨域免登

方案二、Token

原理:将信任关系存储在单独的SS哦系统里,也就是从客户端移到了服务端。

解决问题:1、如何高效的存储大量临时性的信任数据

2、如何防止信息传递过程被篡改

3、如何让SSO系统信任登陆系统和免登系统

解决方案:1、采用类似memcached的分布式缓存的方案,既能提供可扩展数据量的机制,也能提供高效访问。

 2、采用数字签名(数字证书签名或md5等加密方式),这就需要SS哦系统返回免登URL的时候对需要验证的参数进行加密,并带上token一起返回。最后需免登陆的系统进行验证信任关系的时候,需把这个token传给SSO系统,SSO系统通过对token的验证就可以辨别信息是否被改过

 3、设置白名单,也就是只有白名单上的系统才能请求信任关系,同理只有在白名单上的系统才能被免登陆。

基本概念:

1、什么是跨域Web SSO:

域名通过“.”号切分后,从右往左看,不包含"."的是顶级域名,包含一个"."的是一级域名,包含两个"."的是二级域名,依次类推。

https://www.baidu.com:com是顶级域名,baidu.com是一级域名,www.baidu.com是二级域名。

2、浏览器读写cookie的安全性限制:一级或顶级域名不同的网站,无法读取到彼此写的cookie

一级域名相同,只是二级或更高级域名不同的站点,可以通过设置domain参数共享cookie的读写。这种场景可以选择不跨域的SSO方案

域名相同,只是https和http协议不同的URL默认cookie可以共享。

3、http协议是无状态协议,浏览器访问服务器时,要让服务器知道你是谁,只有两种方式:

1)将信息写入cookie,它会随着每次HTTP请求带到服务端

2)在URL、表单数据中带上用户信息(也可能在HTTP头部)。这种方式依赖于从特定的网页入口进入,因为只有走特定的入口,才有机会拼装出相应的信息,提交到服务端。

单点登录的核心步骤:

1、用户未登录时访问子站一、子站一服务器检测到用户没有登录(没有本站点session,因为没传过来session对应的cookie),于是通知浏览器跳转到SSO服务站点,并在跳转的URL参数中带上当前的页面地址,以便登录后自动跳转回本页。

2、SSO服务站点检测到用户没有登录,于是显示登录页面

    用户提交登录请求道服务端,服务端验证通过,创建和账号对应的用户登陆凭证(token)

   然后,服务端通知浏览器把该token作为SSO服务站点的cookie存储起来,并跳转回子站一,跳回子站的URL参数中带上这个token

3、浏览器在写SSO服务站点cookie后,跳转回子站一。

   子站一服务端检测到浏览器请求的URL中带了单点登录的token,于是把这个token发到SSO服务站点验证。

   SSO服务端站点拿token解密出用户账号,把账号信息中允许子站一访问的部分返回给子站一。

      子站一根据返回的信息生成用户在本站的会话,把会话对应cookie写入浏览器,从而完成在本站的登入以及会话保持。之后用户访问再子站一时,都会带上这个cookie,从而保持在本站的登录状态。

 


分享到: