概念
单点登录SSO(Single Sign On)
是一种身份验证和授权机制,它允许用户只需登录一次,就能够访问多个相关但独立的系统或应用。
这种机制通过在用户登录时颁发令牌的方式实现,令牌包含有关用户身份和权限的信息,服务提供者可以通过验证这个令牌来确认用户的身份,而无需用户提供额外的凭证。
SSO
的主要优点包括:
- 用户友好性:用户只需登录一次,即可访问多个应用程序,提供了更好的用户体验和便利性。
- 提高安全性:通过集中的身份验证,可以减少密码泄露和密码管理问题。此外,
SSO
还可以与其他身份验证机制(如多因素身份验证)结合使用,提供更强的安全性。 - 简化管理:
SSO
可以减少管理员的工作量,因为他们不需要为每个应用程序单独管理用户凭据和权限。
CAS认证授权机制
CAS (Central Authentication Service)
是实现单点登录的一个标准化的过程,主要用于实现多个应用系统的统一身份验证。其核心思想是: 用户只需要在一个中央认证服务器
上进行一次登录操作,即可获得访问所有已集成 CAS
的受保护资源的权限,无需在每个应用系统中单独登录。CAS
通过票据(Service Ticket(ST))
的方式来管理用户的会话和认证状态。
CAS
单点登录流程:
- 用户访问受保护资源:用户尝试访问一个受保护的资源,例如一个Web应用程序。
- 重定向到CAS服务器 :如果用户未登录或未携带有效的登录凭证(如票据),应用程序将重定向用户到
CAS服务器
的登录页面。 - 用户登录 :用户在
CAS服务器
的登录页面输入其凭据(通常是用户名和密码)。 - CAS服务器验证 :
CAS服务器
接收用户的凭据,并进行验证。如果凭据有效,CAS服务器
将生成一个Service Ticket(ST)
。 - 发放Service Ticket :
CAS服务器
将Service Ticket
发送给用户。这个票据是一个随机生成的字符串,用于请求访问特定服务。 - 用户携带Service Ticket返回 :用户携带
Service Ticket
返回到原始应用程序。 - 应用程序验证Service Ticket :应用程序接收
Service Ticket
,并将其发送到CAS服务器
以验证票据的有效性
。 - CAS服务器响应验证结果 :如果
Service Ticket
有效,CAS服务器
确认票据有效,并向应用程序提供用户的身份信息。 - 用户被授予访问权限 :应用程序接收到
CAS服务器
的确认后,将允许用户访问请求的资源。 - 用户访问其他服务 :用户在访问其他服务时,将重复步骤2至9,使用新的
Service Ticket
进行认证。 - 单点登出(可选操作) :如果
CAS服务器
支持单点登出,用户可以从任何服务发起登出请求,CAS服务器
将使所有有效的Service Ticket
失效,实现用户在所有服务中的登出。
单点登录技术实现
cookie + session模式
流程:
- 去往认证中心登录,输入账号密码进行登录
- 登录验证成功之后,在
session表格
中记录一条身份信息(sessionId(sid)
和身份信息(唯一id、账号等)
的键值对) - 记录之后,通过响应中的
Set-Cookie
头部将其发送给浏览器,浏览器则将sid
保存在Cookie
中 - 之后访问子系统时,浏览器携带已有的
sid
Cookie 到认证中心,认证中心去查session表格可有登录信息,查到就说明已经登录 - 告诉子系统用户登录
- 子系统访问受保护资源
只要这个
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 重定向传播会话实现单点登录流程:
-
用户访问子系统,检查登录状况。
-
若未登录,用户跳转到子系统登录页面
/sso/login
,并携带back参数
记录初始页面URL。- 形如:
http://{sso-client}/sso/login?back=xxx
- 形如:
-
子系统尚未登录,再次将其重定向至SSO认证中心,并携带
redirect参数
记录子系统的登录页URL。- 形如:
http://{sso-server}/sso/auth?redirect=xxx?back=xxx
- 形如:
-
用户进入了 SSO认证中心 的登录页面,开始登录。
-
用户 输入账号密码 并 登录成功,SSO认证中心再次将用户重定向至子系统的登录接口
/sso/login
,并携带ticket码参数。- 形如:
http://{sso-client}/sso/login?back=xxx&ticket=xxxxxxxxx
- 形如:
-
子系统根据
ticket码
请求接口,从服务端获取账号id,并在子系统进行登录。 -
子系统将用户再次重定向至最初始的
back
页面。
整个过程在第一次登录时,第四步需要手动执行登录,其他步骤全部自动化,之后访问其他子系统时,由于认证中心已登录,则整个过程全部自动化。
今天的分享就到这里,希望可以帮助到你!假如你对文章感兴趣,可以来我的公众号:小新学研社。