单点登录

单点登录SSO的实现原理

单系统登录机制

浏览器第一个请求服务器,服务器会创建一个会话,并将会话的ID作为响应的一部分发送给浏览器,浏览器存储会话ID,并在后续的请求中带上会话ID,服务器取得请求中的会话ID就知道是不是同一个用户了。

浏览器存储会话ID的两种方式

   1.参数
      将会话ID作为每一个请求的参数,服务器接收请求并解析会话ID,就可以判断是否来自同一个会话,此方式不可靠。
   2.cookie
      浏览器维护会话ID,每次发送http请求是浏览器会自动发送会话ID,cookie机制正好用来做这件事。cookie是浏览器用来存储少量数据的一种机制,数据以key/value形式存储,浏览器发送http请求是自动附带cookie信息。
tomcat会话机制也实现了cookie,访问tomcat服务器时,浏览器中可以看到一个名为JSESSIONID的cookie,这就是tomcat会话机制中维护的会话ID。

登录状态
浏览器第一次请求时需要用户输入用户名,密码等身份信息。服务器接收到身份信息之后进行校验,校验成功之后,将会话状态 更新为已登录或已注册状态,并返回受保护的资源。
每次请求受保护资源时都会检查会话对象中的登录状态,只有通过验证的会话才能访问,登录机制因此而实现。

复杂系统机制

web系统早已从久远的单系统发展成为如今由多系统组成的应用群,面对如此众多的系统,用户难道要一个一个登录,一个一个注销?
web系统由单系统发展成多系统组成的应用群,复杂性应该由系统内部承担,而不是用户。无论web系统内部多么复杂,对用户而言,都是一个统一的整体,也就是说,用户访问web系统的整个应用群与访问单个系统一样,登录/注销只要一次就够了。

单新系统登录的限制

虽然单系统的登录解决方案很完美,但对于多系统应用群已经不再适用了,为什么呢?
单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie。
既然这样,为什么不将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。
然而,可行并不代表好,共享cookie的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。
因此,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录

单点登录

什么是单点登录?单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分

登录

相比单系统登录,sso需要一个独立的认证中心,只有认证中心可以接受用户的用户名,密码等身份信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码无误后,创建授权令牌,在接下来的跳转过程中 ,授权令牌作为参数发送给各个子系统。子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式于但系统登录方式相同。

大致流程

  1. 用户访问子系统1的受保护资源,系统1发现用户未授权,跳转至sso认证中心,并将自己的地址作为参数。
  2. sso认证中心发现用户为通过授权,将用户引导至登录页面,进行授权。
  3. sso校验用户信息,创建用户于sso认证中心之间的会话,称为全局会话,同时创建令牌,sso认证中心携带令牌跳转至最初的请求地址(1中的参数,系统1)
  4. 系统1拿到令牌后,去sso认证中心校验令牌是否有效
  5. sso认证中心校验令牌。返回有效,注册系统1
  6. 系统1使用该令牌创建用户的会话,称为局部会话,返回受保护的资源。

用户认证成功之后,会于sso认证中心以及各个子系统创建会话,用户与sso认证中心创建的会话称为全局会话,用户与各个子系统之间创建的会话称为局部会话,局部会话建立之后,用户访问子系统受保护的资源将不再通过sso认证中心。

全局会话和局部会话有如下约束关系

  • 局部会话存在,全局会话一定存在(局部会话的令牌是由全局会话发放的,局部会话过期通知全局会话。所以只要所有局部会话不过期则全局会话不会过期)
  • 全局会话存在,局部会话不一定存在
  • 全局会话销毁,局部会话必须销毁

注销

单点登录自然也要单点注销,在一个子系统中注销,所有子系统的会话都将被销毁

大致流程

  1. 用户向系统1发起注销请求
  2. 系统1根据用户与系统1建立的会话ID拿到令牌,向sso认证中心发起注销请求
  3. sso认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的子系统地址
  4. sso认证中心向所有注册的子系统发起注销请求
  5. 各个注册的子系统接收sso人中中心的注销请求,销毁局部会话
  6. sso认证中心引导用户至登录页面

————————————————
版权声明:本文为CSDN博主「创客公元」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37264997/article/details/80489376

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值