随着企业发展和数字化程度的提高,企业生态下的应用系统逐渐增多,而登录每个系统的帐号密码都不相同,这就需要让每位用户记住多套账号密码并多次登录,密码泄露的风险变得极大,多次登录的使用体验也很差,这时简化不同系统间的登录流程就变得很有必要,单点登录(SSO)就应运而生。

单点登录,Single Sign On(SSO)指的是在多个应用系统中,只需登录一次,就可以访问其他相互信任的应用系统。

单点登录系统

如上图,SSO 是抽出登录的模块,App1,App2 只负责应用模块,SSO只负责登录模块。App1,App2 需要登录时,将跳到 SSO 系统,SSO 系统完成登录,其他的应用系统也就随之登录了。

应用

单点登录在大型网站里使用得非常频繁,例如,阿里旗下有淘宝、天猫、支付宝、阿里巴巴等网站。对于背后的成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,单点登录是很有必要的需求。

SSO 应用核心设计

SSO应用核心设计

前台站点:业务站点A、业务站点B(需要登录的站点)
SSO站点:登录、退出
SSO服务:登录(登录服务)、登录状态(提供登录状态校验/登录信息查询的服务)、退出(用户注销服务)
数据库:存储用户账户信息
缓存:存储用户的登录信息,通常使用 Redis

SSO 应用登录/退出

登录时序图
退出时序图

应用场景案例

阿里系的淘宝和天猫,我们知道这是两个系统,在使用的时候,登录了天猫,淘宝也会自动登录。
场景案例

意义——解决多系统登录问题

单点登录的出现是在解决多系统登录问题。

单个系统的登录认证机制

登录认证

在浏览器 ( Brower ) 中访问一个应用,这个应用需要通过用户名和密码,完成登录证。

当浏览器 ( Brower ) 携带用户名和密码发出请求后,服务端( Server )在 session 中标记登录状态(已登录),并在浏览器( Brower )中写入 cookie ,cookie 是用户的唯一标识。再次访问时,请求会带上这个cookie,服务端会根据 cookie 找到对应的 session,通过 session 来判断这个用户是否登录。

同域下多个系统登录认证(单点登录)

多系统下登录认证

当在一个企业域名下,可以通过二级域名区分不同的系统,实现单点登录(SSO)。例如:app1.a.com 和 app2.a.com 作为应用系统,以及 sso.a.com 登录系统。我们只要在 sso.a.com 登录,app1.a.com 和 app2.a.com就也登录了。

根据登录认证机制,在 sso.a.com 中登录了,在 sso.a.com 的服务端的 session 中记录了登录状态,同时在浏览器端(Browser)的 sso.a.com 下写入了 cookie。

此时会出现两个问题:cookie 不能跨域,session 不共享。

sso 登录以后,可以将 cookie 的域设置为顶域,即 .a.com。这样所有子域的系统都可以访问到顶域的 cookie。我们在 sso 系统登录状态,这时再访问 app1,cookie 也带到了app1 的服务(Server)。app1 的服务端怎么找到这个 cookie 对应的 session ?

这里需要把两个 app 系统的 session 共享,共享 session 的解决方案有很多,例如:Spring-Session。
通过巧用 cookie 顶域的特性,和 session 共享,可以实现同域下的多个系统登录认证,也就是同域下的单点登录。

不同域下的系统登录认证(单点登录)

CAS(Central Authentication Service),中央认证服务。
CAS单点登录原理

  • app1 系统登录的流程:
  1. 用户访问 app 系统,app 系统是需要登录的,但用户现在没有登录。
  2. 跳转到 CAS server,即 SSO 登录系统, SSO 系统也没有登录,弹出用户登录页。
  3. 用户填写用户名、密码,SSO 系统进行认证后,将登录状态写入 SSO 的 session,浏览器(Browser)中写入 SSO 域下的 Cookie。
  4. SSO 系统登录完成后会生成一个ST(Service Ticket),然后跳转到 app 系统,同时将 ST 作为参数传递给 app 系统。
  5. app 系统拿到 ST 后,从后台向 SSO 发送请求,验证 ST 是否有效。
  6. 验证通过后,app 系统将登录状态写入 session 并设置 app 域下的 cookie。
  • app2 系统时的流程:
  1. 用户访问 app2 系统,app2 系统没有登录,跳转到 SSO。
  2. 由于 SSO 已经登录了,不需要重新登录认证。
  3. SSO 生成 ST ,浏览器跳转到 app2 系统,并将 ST 作为参数传递给 app2。
  4. app2 拿到 ST,后台访问 SSO,验证 ST 是否有效。
  5. 验证成功后,app2 将登录状态写入 session,并在 app2 域下写入 Cookie。

单点登录的应用,对于用户能极大改善登录频率,及时访问到所需的资源。对于账户的管理,单点登录统一了身份认证和机制,更加便于管理。同时对于安全层面,单点登录为其他应用系统提供了更强的身份认证机制,从而提高了整体系统的安全性。

最后修改:2023 年 09 月 11 日
如果觉得我的文章对你有用,请随意赞赏