单点登录(SSO)以及中央认证服务(CAS)

SSO介绍

SSO(Single sign-on):在多个相互信任的应用系统中,只需要登录一次,就可以访问其他的应用系统。

SSO的实现方式

无论是SSO还是普通登录,它们的实现都是基于Cookie-Session模式的。该模式的基本流程如下:

640.png

从上面可以看出,cookie 是服务端生成发送到浏览器端的。浏览器端将 cookie 存储在本地,并且在之后每次的用户端 HTTP 请求头中都附带的一小段数据。

而且cookie 是跟域名关联的,其对应浏览器所请求的域名

cookie有如下的重要属性:

  1. Name:单条 cookie 信息的 key 值,我们通常也是通过这个 key 值设置和获取存储在 cookie 中数据。

  2. Value:我们所说的cookie的值。

  3. Expires/Max-Age:此条 cookie 记录的到期时间。

  4. Domain:此条 cookie 的作用范围。我们知道域名是分多个级别的,如:顶级域名、二级域名、三级域名等等。domain 属性是指可以访问该 cookie 的域名。如果设置为 '.baidu.com',那么末尾是 '.baidu.com' 结束的域名都可以访问到这个 cookie,要注意必须是 '.' 开头。这产生了一个效果,那就是 '.baidu.com' 下属的子域名也可以访问这个 cookie,例如: '.tieba.baidu.com'。

1、各子系统在相同的域名下

一般情况下,企业只有一个二级域名,然后通过三级域名区分不同的系统。比如公司有个二级域名叫做:.bl.com,同时有两个业务系统分别为:.app1.bl.com和 .app2.bl.com,以及一个登录系统:.sso.bl.com。

我们要实现只在 .sso.bl.com登录,.app1.bl.com和 .app2.bl.com也就登录了。

例如,用户通过浏览器登录 .sso.bl.com系统,根据cookie-session模式可知, .sso.bl.com 的服务端的session中会记录登录状态,同时浏览器会保存cookie信息,其中cookie的Domain属性为 .sso.bl.com。

如果我们想让其他两个系统 .app1.bl.com 和 .app2.bl.com 登录,需要解决两个问题:

  • 浏览器的cookie的Domain属性是.sso.a.com,在给app1.bl.com和app2.bl.com发送请求是带不上的。

  • sso、app1和app2是不同的应用,它们的session存在自己的应用内,是不共享的。

好在解决这两个问题是比较简单的。针对第一个问题,sso登录以后,可以将cookie的域设置为二级域名 .bl.com,这样所有子域的系统都可以访问到二级域的 cookie。针对第二个问题,解决方法就是 seesion共享。

2、各子系统属于不同的域

若各个子系统属于不同的域,那么它们之间的 cookie 是无法共享的。因此需要一种新的解决方案,目前单点登录的标准流程就是 CAS。

CAS

Central Authentication Service ——— 中央认证服务,是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。

标准的CAS登录流程如下:


cas_flow_diagram.png

第一次访问app:

  1. 用户访问app系统,app系统是需要登录的,app验证cookie和session发现用户没有登录,要求用户重定向到 CAS Server,同时要携带service参数。

  2. 跳转到CAS Server,CAS Server系统发现用户也没有登录本系统,弹出用户登录页。

  3. 用户填写用户名、密码,CAS Server系统进行认证后,CAS Server生成一个该用户的SSO session存放到本地session中,并生成一个SSO session id,即TGT。最后重定向返回一个CASTGC(放在cookie内)给用户浏览器,这个TGC中包含了TGT的值。

  4. CAS Server系统登录完成后会生成一个ST(Service Ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。

  5. app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。

  6. 验证通过后,app系统将登录状态写入session并设置app域下的Cookie,再返回给浏览器。

  7. 用户发起请求,带上cookie,app系统校验cookie和session。通过后,返回app正确的内容给浏览器。

第二次方法app:

  1. 用户发起请求,并带上 Cookie 中的 JSESSIONIDapp 服务端。

  2. app 服务端 使用 JSESSIONIDSession 中存储的数据进行校验。

  3. 校验通过,返回正确的内容,展示 app

再app登录成功的情况下,第一次访问app2:

  1. 访问 app2 服务地址,app2 请求未通过认证,重定向至 CAS Server 地址。

  2. 访问 CAS Server 地址,发送认证请求,带上 TGC 信息。

  3. CAS Server 通过 TGC中的TGT 去查找 SSO Session 的信息进行认证。

  4. 认证通过,生成票据 ST 重定向至 app2 的服务地址。

  5. app2 服务 携带 STCAS Server 进行认证。

  6. CAS Server 认证成功,返回通过的响应。

  7. app2 服务拿到成功的响应后,设置 Session,并重定向至 app2 的地址,并设置 Cookie MOD_AUTH_CAS_S

  8. 用户浏览器 发起请求,带上 Cookie 中的 MOD_AUTH_CAS_S ,发送给app2 服务进行校验。

  9. app2 服务使用 MOD_AUTH_CAS_SSession 中存储的数据进行校验。

  10. 校验通过,返回正确的内容,展示 app2

CAS重要字段

TGT

CAS Server 创建TGT,存放在 CAS Server的 Session 里面,根据用户信息签发的。简单来说,TGT 是 SSO Session 的 ID。

TGC

创建 TGT 的同时,生成 TGC。通过 CAS Serverresponse header 的 set-cookie 字段设置 TGC,其中包含了 TGT 的信息。

ST

根据 TGT 签发的 ST,是 CAS 为用户签发的访问某一 service 的票据。在CAS Server 创建 TGT 后,生成一个 ST 将其添到重定向地址后。

为了保证ST的安全性:ST 是基于随机生成的,没有规律性。而且,CAS规定 ST 只能存活一定的时间,然后 CAS Server 会让它失效。而且,CAS 协议规定ST只能使用一次,无论 Service Ticket 验证是否成功, CASServer 都会清除服务端缓存中的该 Ticket ,从而可以确保一个 Service Ticket 不被使用两次。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容