随着企业发展和数字化程度的提高,企业生态下的应用系统逐渐增多,而登录每个系统的帐号密码都不相同,这就需要让每位用户记住多套账号密码并多次登录,密码泄露的风险变得极大,多次登录的使用体验也很差,这时简化不同系统间的登录流程就变得很有必要,单点登录(SSO)就应运而生。
单点登录,Single Sign On(SSO)指的是在多个应用系统中,只需登录一次,就可以访问其他相互信任的应用系统。
如上图,SSO 是抽出登录的模块,App1,App2 只负责应用模块,SSO只负责登录模块。App1,App2 需要登录时,将跳到 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),中央认证服务。
- app1 系统登录的流程:
- 用户访问 app 系统,app 系统是需要登录的,但用户现在没有登录。
- 跳转到 CAS server,即 SSO 登录系统, SSO 系统也没有登录,弹出用户登录页。
- 用户填写用户名、密码,SSO 系统进行认证后,将登录状态写入 SSO 的 session,浏览器(Browser)中写入 SSO 域下的 Cookie。
- SSO 系统登录完成后会生成一个ST(Service Ticket),然后跳转到 app 系统,同时将 ST 作为参数传递给 app 系统。
- app 系统拿到 ST 后,从后台向 SSO 发送请求,验证 ST 是否有效。
- 验证通过后,app 系统将登录状态写入 session 并设置 app 域下的 cookie。
- app2 系统时的流程:
- 用户访问 app2 系统,app2 系统没有登录,跳转到 SSO。
- 由于 SSO 已经登录了,不需要重新登录认证。
- SSO 生成 ST ,浏览器跳转到 app2 系统,并将 ST 作为参数传递给 app2。
- app2 拿到 ST,后台访问 SSO,验证 ST 是否有效。
- 验证成功后,app2 将登录状态写入 session,并在 app2 域下写入 Cookie。
单点登录的应用,对于用户能极大改善登录频率,及时访问到所需的资源。对于账户的管理,单点登录统一了身份认证和机制,更加便于管理。同时对于安全层面,单点登录为其他应用系统提供了更强的身份认证机制,从而提高了整体系统的安全性。
此处评论已关闭