首页 > 其他分享 >5. 单点登录(Single Sign On)

5. 单点登录(Single Sign On)

时间:2023-02-17 14:13:09浏览次数:48  
标签:单点 登录 CAS ST Single Cookie 认证 Sign com

前面已经知道了,在同域下的客户端/服务端认证系统中,通过客户端携带凭证,可以维持一段时间内的登录状态。
但随着企业的发展,一个大型系统里可能包含 n 多子系统,用户在操作不同的系统时,需要多次登录,很麻烦,那么单点登录(SSO) 就可以很好的解决这个问题的,在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。

例如登录天猫,淘宝也会自动登录;
登录百度贴吧,百度网盘也会自动登录;

5.1 同域下的 SSO(主域名相同)

当百度网站存在两个相同主域名下的贴吧子系统  tieba.baidu.com  和网盘子系统  pan.baidu.com  时,以下为他们实现 SSO 的步骤:

客户端: 用户访问某个子系统时(例如  tieba.baidu.com),如果没有登录,则跳转至 SSO 认证中心提供的登录页面进行登录;
服务端: 登录认证后,服务端把登录用户的信息存储于 Session 中,并且附加在响应头的  Set-Cookie  字段中,设置 Cookie 的 Domain 为 .baidu.com ;
客户端:再次发送请求时,携带主域名 Domain 下的 Cookie 给服务器,此时服务端就可以通过该 Cookie 来验证登录状态了;

其实不难发现,这就是上面讲的 Session-Cookie 认证 登录方式; 但如果是不同域呢?毕竟不同域之间 Cookie 是不共享的,那怎么办?

5.2 跨域下的 SSO(主域名不同)

在常见的购物网站天猫 (tmall.com) 和 淘宝 (taobao.com) 中,只需要登录其中某一个系统,另外一个系统打开后就会默认登录,那么这是怎么做的呢?

那么就有了 CAS(Central Authentication Service)中央授权服务,那么先主要说下 CAS 的流程;
单点登录下的 CAS 认证流程图:

单点登录下的 CAS 认证步骤详解:

  1. 客户端: 开始访问系统 A;
  2. 系统 A: 发现用户未登录,重定向至 CAS 认证服务(sso.com),同时 URL 地址参数携带登录成功后回跳到系统 A 的页面链接(https://sso.com/login?redirectURL=https%3A%2F%2Fwww.taobao.com)
  3. CAS 认证服务: 发现请求 Cookie 中没有携带登录的票据凭证(TGC),所以 CAS 认证服务判定用户处于   未登录   状态,重定向用户页面至 CAS 的登录界面,用户在 CAS 的登录页面上进行登录操作。
  4. 客户端: 输入用户名密码进行 CAS 系统认证;
  5. CAS 认证服务: 校验用户信息,并且 生成 TGC 放入自己的 Session 中,同时以 Set-Cookie 形式写入 Domain 为 sso.com 的域下 ;同时生成一个 授权令牌 ST (Service Ticket) ,然后重定向至系统 A 的地址,重定向的地址中包含生成的 ST(重定向地址:www.taobao.com?token=ST-345678)
  6. 系统 A: 拿着 ST 向 CAS 认证服务发送请求,CAS 认证服务验证票据 (ST) 的有效性。验证成功后,系统 A 知道用户已经在 CAS 登录了(其中的 ST 可以保存到 Cookie 或者本地中),系统 A 服务器使用该票据 (ST) 创建与用户的会话,称为局部会话,返回受保护资源;

到这里客户端就可以跟系统 A 愉快的交往啦 ~

  1. 客户端: 开始访问系统 B;
  2. 系统 B: 发现用户未登录,重定向至 SSO 认证服务,并将自己的地址作为参数传递,并附上在 sso.com 域下的 cookie 值是第五步生成的 TGC;
  3. CAS 认证服务: CAS 认证服务中心发现用户已登录,跳转回系统 B 的地址,并附上票据 (ST) ;
  4. 系统 B: 拿到票据 (ST),去 CAS 认证服务验证票据 (ST) 的有效性。验证成功后,客户端也可以跟系统 B 交往了 ~

单点登录下需要注意的点:

如图中流程所示,发现 CAS 认证服务 在签发的 授权令牌 ST 后,直接重定向,这样其实是比较容易容易被窃取,那么需要在系统 A 或者系统 B 在向 CAS 验证成功 (如图中的第 14 步和第 11 步) 后,再生成另一个新的验证 Token 返回给客户端保存;

CAS 一般提供四个接口:
/login:登录接口,用于登录到中央授权服务
/logout:登出接口,用于从中央授权服务中登出
/validate:用于验证用户是否登录中央授权服务
/serviceValidate:用于让各个 Service 验证用户是否登录中央授权服务

CAS 生成的票据:
TGT(Ticket Grangting Ticket) :TGT 是 CAS 为用户签发的   登录票据,拥有了 TGT,用户就可以证明自己在 CAS 成功登录过。
TGC:Ticket Granting Cookie: CAS Server 生成 TGT 放入自己的 Session 中,而 TGC 就是这个 Session 的唯一标识(SessionId),以 Cookie 形式放到浏览器端,是 CAS Server 用来明确用户身份的凭证。
ST(Service Ticket) :ST 是 CAS 为用户签发的访问某个 Service 的票据。

标签:单点,登录,CAS,ST,Single,Cookie,认证,Sign,com
From: https://www.cnblogs.com/wp-leonard/p/17129923.html

相关文章