简化访问:深入理解SSO单点登录

概念

单点登录SSO(Single Sign On)是一种身份验证和授权机制,它允许用户只需登录一次,就能够访问多个相关但独立的系统或应用。

这种机制通过在用户登录时颁发令牌的方式实现,令牌包含有关用户身份和权限的信息,服务提供者可以通过验证这个令牌来确认用户的身份,而无需用户提供额外的凭证。

SSO的主要优点包括:

  1. 用户友好性:用户只需登录一次,即可访问多个应用程序,提供了更好的用户体验和便利性。
  2. 提高安全性:通过集中的身份验证,可以减少密码泄露和密码管理问题。此外,SSO还可以与其他身份验证机制(如多因素身份验证)结合使用,提供更强的安全性。
  3. 简化管理:SSO可以减少管理员的工作量,因为他们不需要为每个应用程序单独管理用户凭据和权限。

CAS认证授权机制

CAS (Central Authentication Service)是实现单点登录的一个标准化的过程,主要用于实现多个应用系统的统一身份验证。其核心思想是: 用户只需要在一个中央认证服务器上进行一次登录操作,即可获得访问所有已集成 CAS 的受保护资源的权限,无需在每个应用系统中单独登录。CAS 通过票据(Service Ticket(ST))的方式来管理用户的会话和认证状态。

CAS单点登录流程:

  1. 用户访问受保护资源:用户尝试访问一个受保护的资源,例如一个Web应用程序。
  2. 重定向到CAS服务器 :如果用户未登录或未携带有效的登录凭证(如票据),应用程序将重定向用户到CAS服务器的登录页面。
  3. 用户登录 :用户在CAS服务器的登录页面输入其凭据(通常是用户名和密码)。
  4. CAS服务器验证CAS服务器接收用户的凭据,并进行验证。如果凭据有效,CAS服务器将生成一个Service Ticket(ST)
  5. 发放Service TicketCAS服务器Service Ticket发送给用户。这个票据是一个随机生成的字符串,用于请求访问特定服务。
  6. 用户携带Service Ticket返回 :用户携带Service Ticket返回到原始应用程序。
  7. 应用程序验证Service Ticket :应用程序接收Service Ticket,并将其发送到CAS服务器验证票据的有效性
  8. CAS服务器响应验证结果 :如果Service Ticket有效,CAS服务器确认票据有效,并向应用程序提供用户的身份信息。
  9. 用户被授予访问权限 :应用程序接收到CAS服务器的确认后,将允许用户访问请求的资源。
  10. 用户访问其他服务 :用户在访问其他服务时,将重复步骤2至9,使用新的Service Ticket进行认证。
  11. 单点登出(可选操作) :如果CAS服务器支持单点登出,用户可以从任何服务发起登出请求,CAS服务器将使所有有效的Service Ticket失效,实现用户在所有服务中的登出。

单点登录技术实现

流程:

  1. 去往认证中心登录,输入账号密码进行登录
  2. 登录验证成功之后,在session表格中记录一条身份信息(sessionId(sid)身份信息(唯一id、账号等)的键值对)
  3. 记录之后,通过响应中的Set-Cookie头部将其发送给浏览器,浏览器则将sid保存在Cookie
  4. 之后访问子系统时,浏览器携带已有的sidCookie 到认证中心,认证中心去查session表格可有登录信息,查到就说明已经登录
  5. 告诉子系统用户登录
  6. 子系统访问受保护资源

只要这个session表格中有这条记录,就说明这个用户是登录成功的,没有则未登录,或者是过期

优点

  • 认证中心具有强控制力,拥有对用户的绝对控制:假如有用户进行了违规操作,直接处理session表格即可让其下线。

缺点

  • 成本高:网站用户量大,导致认证中心压力大,各种子系统都要发sid过来,session表格变得很大,可能需要session集群
  • 风险高:认证中心挂掉则所有系统都挂掉,可能还需要进行容灾

token模式

token模式是一种分布式的模式,子系统自己认证:

优点

  • 压力小:如果子系统用户量变大,几乎和认证中心无关。

缺点

  • 控制力弱:如果token时间过长,认证中心失去了对子系统的控制,无法指定用户下线。
  • 用户体验:如果token时间过短,需要频繁登录,影响用户体验。

token + refreshToken模式

  • 用户在认证中心登录后会颁发两个token:

    • 一个是所有子系统都能认识token(过期时间非常短,比如十几二十分钟)
    • 一个是只有认证中心才认识refreshToken(过期时间长,比如一周一个月)
  • 用户请求时带的是短的token,当这个token过期后,用户使用refreshToken向认证中心获取新的token,刷新token没有问题就颁发一个新的token给子系统

过一段时间需要进入一次认证中心,便于控制。

URL重定向传播会话

上面我们介绍了CAS认证的方式,在传统的CAS单点登录实现中,主要使用的是票据(Ticket)机制,而不是令牌(Token)机制。有一种常见的SSO实现技术,它并不依赖于特定的认证协议或机制比如CAS,但是大致流程如出一辙,就是使用 URL 重定向传播会话实现单点登录

这是一种通用的 SSO 实现策略,可以与不同的认证协议(如 CAS、OAuth2 + OIDC)结合使用,并不局限于某一种特定的技术或机制。

在这种实现中,当用户首次访问应用时,如果发现用户未登录,应用会重定向用户到认证中心服务器。用户在认证中心上登录后,服务器通过 URL 重定向将用户带回到原始应用,并附带一些认证信息(如授权码或ticket票据,票据有效时长很短)。

URL 重定向传播会话实现单点登录流程:

  1. 用户访问子系统,检查登录状况。

  2. 若未登录,用户跳转到子系统登录页面/sso/login,并携带back参数 记录初始页面URL。

    • 形如:http://{sso-client}/sso/login?back=xxx
  3. 子系统尚未登录,再次将其重定向至SSO认证中心,并携带redirect参数记录子系统的登录页URL。

    • 形如:http://{sso-server}/sso/auth?redirect=xxx?back=xxx
  4. 用户进入了 SSO认证中心 的登录页面,开始登录。

  5. 用户 输入账号密码 并 登录成功,SSO认证中心再次将用户重定向至子系统的登录接口/sso/login,并携带ticket码参数。

    • 形如:http://{sso-client}/sso/login?back=xxx&ticket=xxxxxxxxx
  6. 子系统根据 ticket码 请求接口,从服务端获取账号id,并在子系统进行登录。

  7. 子系统将用户再次重定向至最初始的 back 页面。

整个过程在第一次登录时,第四步需要手动执行登录,其他步骤全部自动化,之后访问其他子系统时,由于认证中心已登录,则整个过程全部自动化。

今天的分享就到这里,希望可以帮助到你!假如你对文章感兴趣,可以来我的公众号:小新学研社

相关推荐
wkj0012 小时前
vue中 js-cookie 用法
前端·javascript·vue.js
义薄云天us4 小时前
028_分布式部署架构
人工智能·分布式·架构·claude code
GoldKey6 小时前
gcc 源码阅读---语法树
linux·前端·windows
心平愈三千疾6 小时前
学习秒杀系统-实现秒杀功能(商品列表,商品详情,基本秒杀功能实现,订单详情)
java·分布式·学习
Xf3n1an7 小时前
html语法
前端·html
张拭心7 小时前
亚马逊 AI IDE Kiro “狙击”Cursor?实测心得
前端·ai编程
漠月瑾-西安7 小时前
如何在 React + TypeScript 中实现 JSON 格式化功能
javascript·jst实现json格式化
烛阴7 小时前
为什么你的Python项目总是混乱?层级包构建全解析
前端·python
止观止8 小时前
React响应式组件范式:从类组件到Hooks
javascript·react.js·ecmascript
@大迁世界8 小时前
React 及其生态新闻 — 2025年6月
前端·javascript·react.js·前端框架·ecmascript