`

CAS单点登陆原理

    博客分类:
  • CAS
 
阅读更多

 

 

CAS 的基本原理

       CAS(Central Authentication Service) Yale 大学发起的一个开源项目,据统计,大概每 10 个采用开源构建 Web SSO Java 项目,就有 8 个使用 CAS 。对这些统计,我虽然不以为然,但有一点可以肯定的是, CAS 是我认为最简单实效,而且足够安全的 SSO 选择。

       本节主要分析 CAS 的安全性,以及为什么 CAS 被这样设计,带着少许密码学的基础知识,我希望有助于读者对 CAS 的协议有更深层次的理解。

2.1 CAS 的结构体系

从结构体系看, CAS 包含两部分:

l         CAS Server

CAS Server 负责完成对用户的认证工作, CAS Server 需要独立部署,有不止一种 CAS Server 的实现, Yale CAS Server ESUP CAS Server 都是很不错的选择。

CAS Server 会处理用户名 / 密码等凭证 (Credentials) ,它可能会到数据库检索一条用户帐号信息,也可能在 XML 文件中检索用户密码,对这种方式, CAS 均提供一种灵活但同一的接口 / 实现分离的方式, CAS 究竟是用何种认证方式,跟 CAS 协议是分离的,也就是,这个认证的实现细节可以自己定制和扩展。

l         CAS Client

CAS Client 负责部署在客户端(注意,我是指 Web 应用),原则上, CAS Client 的部署意味着,当有对本地 Web 应用的受保护资源的访问请求,并且需要对请求方进行身份认证, Web 应用不再接受任何的用户名密码等类似的 Credentials ,而是重定向到 CAS Server 进行认证。

目前, CAS Client 支持(某些在完善中)非常多的客户端,包括 Java .Net ISAPI Php Perl uPortal Acegi Ruby VBScript 等客户端,几乎可以这样说, CAS 协议能够适合任何语言编写的客户端应用。

2.2 CAS 协议

       剖析协议就像剖析设计模式,有些时候,协议让人摸不着头脑。 CAS 的代理模式要相对复杂一些,它引入了一些新的概念,我希望能够在这里描述一下其原理,有助于读者在配置和调试 CAS SSO 有更清晰的思路。

如果没记错, CAS 协议应该是由 Drew Mazurek 负责可开发的,从 CAS v1 到现在的 CAS v3 ,整个协议的基础思想都是基于 Kerberos 的票据方式。

       CAS v1 非常原始,传送一个用户名居然是 ”yes\ndavid.turing” 的方式, CAS v2 开始使用了 XML 规范,大大增强了可扩展性, CAS v3 开始使用 AOP 技术,让 Spring 爱好者可以轻松配置 CAS Server 到现有的应用环境中。

CAS 是通过 TGT(Ticket Granting Ticket) 来获取 ST(Service Ticket) ,通过 ST 来访问服务,而 CAS 也有对应 TGT ST 的实体,而且他们在保护 TGT 的方法上虽然有所区别,但是,最终都可以实现这样一个目的——免去多次登录的麻烦。

       下面,我们看看 CAS 的基本协议框架:

2.1.1 基础协议

 

                                                 CAS 基础模式

       上图是一个最基础的 CAS 协议, CAS Client Filter 方式保护 Web 应用的受保护资源,过滤从客户端过来的每一个 Web 请求,同时, CAS Client 会分析 HTTP 请求中是否包请求 Service Ticket( 上图中的 Ticket) ,如果没有,则说明该用户是没有经过认证的,于是, CAS Client 会重定向用户请求到 CAS Server Step 2 )。 Step 3 是用户认证过程,如果用户提供了正确的 Credentials CAS Server 会产生一个随机的 Service Ticket ,然后,缓存该 Ticket ,并且重定向用户到 CAS Client (附带刚才产生的 Service Ticket ), Service Ticket 是不可以伪造的,最后, Step 5 Step6 CAS Client CAS Server 之间完成了一个对用户的身份核实,用 Ticket 查到 Username ,因为 Ticket CAS Server 产生的,因此,所以 CAS Server 的判断是毋庸置疑的。

       该协议完成了一个很简单的任务,就是 User(david.turing) 打开 IE ,直接访问 helloservice 应用,它被立即重定向到 CAS Server 进行认证, User 可能感觉到浏览器在 helloservcie casserver 之间重定向,但 User 是看不到, CAS Client CAS Server 相互间的 Service Ticket 核实 (Validation) 过程。当 CAS Server 告知 CAS Client 用户 Service Ticket 对应确凿身份, CAS Client 才会对当前 Request 的用户进行服务。

2.2.2 CAS 如何实现 SSO

       当我们的 Web 时代还处于初级阶段的时候, SSO 是通过共享 cookies 来实现,比如,下面三个域名要做 SSO

http://www.blogjava.net

http://www.matrix.org.cn

http://www.csdn.net

如果通过 CAS 来集成这三个应用,那么,这三个域名都要做一些域名映射,

http://blogjava.cas.org

http://matrix.cas.org

http://csdn.cas.org

因为是同一个域,所以每个站点都能够共享基于 cas.org cookies 。这种方法原始,不灵活而且有不少安全隐患,已经被抛弃了。

CAS 可以很简单的实现跨域的 SSO ,因为,单点被控制在 CAS Server ,用户最有价值的 TGC-Cookie 只是跟 CAS Server 相关, CAS Server 就只有一个,因此,解决了 cookies 不能跨域的问题。

回到 CAS 的基础协议图,当 Step3 完成之后, CAS Server 会向 User 发送一个 Ticket granting cookie (TGC) User 的浏览器,这个 Cookie 就类似 Kerberos TGT ,下次当用户被 Helloservice2 重定向到 CAS Server 的时候, CAS Server 会主动 Get 到这个 TGC cookie ,然后做下面的事情:

1,              如果 User 的持有 TGC 且其还没失效,那么就走基础协议图的 Step4 ,达到了 SSO 的效果。

2,              如果 TGC 失效,那么用户还是要重新认证 ( 走基础协议图的 Step3)

2.2.2 CAS 的代理模式

       模式 1 已经能够满足大部分简单的 SSO 应用,现在,我们探讨一种更复杂的情况,即用户访问 helloservice helloservice 又依赖于 helloservice2 来获取一些信息,如同:

User à helloservice à helloservice2

这种情况下,假设 helloservice2 也是需要对 User 进行身份验证才能访问,那么,为了不影响用户体验(过多的重定向导致 User IE 窗口不停地 闪动 ) CAS 引入了一种 Proxy 认证机制,即 CAS Client 可以代理用户去访问其它 Web 应用。

代理的前提是需要 CAS Client 拥有用户的身份信息 ( 类似凭据 ) 与其说之前我们提到的 TGC 是用户持有对自己身份信息的一种凭据,则这里的 PGT 就是 CAS Client 端持有的对用户身份信息的一种凭据。凭借 TGC User 可以免去输入密码以获取访问其它服务的 Service Ticket ,所以,这里,凭借 PGT Web 应用可以代理用户去实现后端的认证,而无需前端用户的参与。

如下面的 CAS Proxy 图所示, CAS Client 在基础协议之上,提供了一个额外的 PGT URL CAS Server, 于是, CAS Server 可以通过 PGT URL 提供一个 PGT CAS Client

 
      
初学者可能会对上图的 PGT URL 感到迷惑,或者会问,为什么要这么麻烦,要通过一个额外的 URL( 而且是 SSL 的入口 ) 去传递 PGT ?如果直接在 Step 6 返回,则连用来做对应关系的 PGTIOU 都可以省掉。 PGTIOU 设计是从安全性考虑的,非常必要, CAS 协议安全性问题我会在后面一节介绍。

于是, CAS Client 拿到了 PGT( PGTIOU-85…..ti2td ) ,这个 PGT TGC 同样地关键, CAS Client 可以通过 PGT 向后端 Web 应用进行认证。如下图所示, Proxy 认证与普通的认证其实差别不大, Step1, 2 与基础模式的 Step 1,2 几乎一样,唯一不同的是, Proxy 模式用的是 PGT 而不是 TGC ,是 Proxy Ticket PT )而不是 Service Ticket

最终的结果是, helloservice2 明白 helloservice 所代理的客户是 David. Turing 同学,同时,根据本地策略, helloservice2 有义务为 PGTURL=http://helloservice/proxy 服务 (PGTURL 用于表示一个 Proxy 服务 ) ,于是它传递数据给 helloservice 。这样, helloservice 便完成一个代理者的角色,协助 User 返回他想要的数据。

 

 
   代理认证模式非常有用,它也是
CAS 协议 v2 的一个最大的变化,这种模式非常适合在复杂的业务领域中应用 SSO 。因为,以前我们实施 SSO 的时候,都是假定以 IE User SSO 的访问者,忽视了业务系统作为 SSO 的访问者角色。

2.3 CAS 安全性

       CAS 的安全性是一个非常重要的 Topic CAS v1 v3 ,都很依赖于 SSL ,它假定了这样一个事实,用户在一个非常不安全的网络环境中使用 SSO Hacker Sniffer 会很容易抓住所有的 Http Traffic ,包括通过 Http 传送的密码甚至 Ticket 票据。

2.3.1 TGC/PGT 安全性

       对于一个 CAS 用户来说,最重要是要保护它的 TGC ,如果 TGC 不慎被 CAS Server 以外的实体获得, Hacker 能够找到该 TGC ,然后冒充 CAS 用户访问所有授权资源。

       SSO 的安全性问题比普通应用的安全性还要严重,因为 SSO 存在一种门槛效应。以前即使 Hacker 能够截获用户在 Web 应用 A 的密码,它也未必能知道用户在 Web 应用 B 的密码,但 SSO Hacker 只需要截获 TGC( 突破了门槛 ) ,即能访问所有与该用户相关的所有应用系统。

       PGT TGC 的角色是一样的,如果被 Hacker 获得,后果可想而知。

       从基础模式可以看出, TGC CAS Server 通过 SSL 方式发送给终端用户,因此,要截取 TGC 难度非常大,从而确保 CAS 的安全性。

       因此,某些人认为 CAS 可以不使用 SSL 的想法需要更正一下, CAS 的传输安全性仅仅依赖与 SSL

       Kerberos 一样 TGT TGC 也有自己的存活周期。下面是 CAS web.xml 中,通过 grantingTimeout 来设置 CAS TGC 存活周期的参数,参数默认是 120 分钟,在合适的范围内设置最小值,太短,会影响 SSO 体验,太长,会增加安全性风险。

    <context-param>

        <param-name>edu.yale.its.tp.cas.grantingTimeout</param-name>

        <param-value>7200</param-value>

    </context-param>

TGC 面临的风险主要并非传输窃取。比如你登陆了之后,没有 Logout ,离开了电脑,别人就可以打开你的浏览器,直接访问你授权访问的应用 ) ,设置一个 TGC 的有效期,可以减少被别人盗用,或者被 Hacker 入侵你的电脑直接获取你系统目录下的 TGC Cookie

 

2.3.2 Service Ticket/Proxy Ticket 安全性

       首要明白, Service Ticket 是通过 Http 传送的,以为着所网络中的其他人可以 Sniffer 到其他人的 Ticket

CAS 协议从几个方面让 Service Ticket 变得更加安全。

l         Service Ticket 只能使用一次。

CAS 协议规定,无论 Service Ticket 验证是否成功, CAS Server 都会将服务端的缓存中清除该 Ticket ,从而可以确保一个 Service Ticket 被使用两次。

l         Service Ticket 在一段时间内失效。

假设用户拿到 Service Ticket 之后,他请求 helloservice 的过程又被中断了, Service Ticket 就被空置了,事实上,此时, Service Ticket 仍然有效。 CAS 规定 Service Ticket 只能存活一定的时间,然后 CAS Server 会让它失效。通过在 web.xml 中配置下面的参数,可以让 Service Ticket 在多少秒内失效。

<context-param>

<param-name>edu.yale.its.tp.cas.serviceTimeout</param-name>

<param-value>300 </param-value>

</context-param>

       该参数在业务应用的条件范围内,越小越安全。

l         Service Ticket 是基于随机数生成的。

Service Ticket 必须足够随机,如果 Service Ticket 生成规则被猜出(如果你使用了 ST+Helloservice+ 自增序列的方式, Hacker 就可以构造下一个 Ticket ), Hacker 就等于绕过 CAS 认证,直接访问所有服务。

 

 

角色

一台用来验证用户身份的站点Server 应用站点application1,应用站点application2

传统做法

传统实现SSO是基于cookie技术,Server站点为已登录用户设置其域(例如.blogbus.com)下cookie,cookie被设置到了客户端的浏览器上。我们以登录application1之后登录application2为用例,交互表示为如下步骤

1.用户访问application1,application1取用户的域(例如.blogbus.com)下的cookie ,不能找到cookie,重定向到Server,要求Server验证。

2.Server验证完毕,为用户设置cookie,重定向到application1

3.用户访问application2,可以取到域下的cookie,验证用户为已登录,直接访问。

传统做法是有很大的弊端的,基于cookie的方法只能在同一个域实现,当然,可以用域名重定向的方法使几个站点具有相同的域名。但还是有解决不了的时候,典型的象搜狐(sohu),及chinaren。如果它们要做SSO,那么域名重定向是不行的。

从网上搜寻了一下,还是有方法解决的。大意是在访问application时,利用一个隐藏的iframe去访问Server,Server在验证完毕后将转向到application。这里的实现方式有点类似于CAS,接下来讲述一下CAS的SSO实现原理。

CAS单点登录原理

利用之前的角色及上面的用例,交互可以表示为如下步骤

1.用户访问application1,application1查看session中是否有用户登录的信息(使用session的情况下),如果没有,转向到Server要求用户认证身份,此时将会把此用户的sessionId一并传给Server。

2.用户被转向到Server认证成功后,Server生成ticket号和票据,将号和票据连同application1的SessionId一 并存入服务器端(可以选择内存,也可以选择数据库持久化),并在用户浏览器中设置cookie,确保已经登录。之后Server将用户redirect到 application1,并且增加tickect号参数。

3。application1收到Server回传回来的tickect号参数,根据这个参数application1在后台 与Server建立安全连接,验证tickect的有效性,并且接受Server返回的用户信息。登录成功。

4。用户登录application2.application2发现用户session中有未登录信息,转向到Server,Server取用户 cookie,发现用户已经登录成功过。于是把用户在application2的sessionId记录,返回ticket参数给 application2。application2验证过程类似3。

CAS单点登出原理

类似于之前的角色,我们重写单点登出的用例。用户从application1登出。交互步骤如下:

1.用户在application1点击登出,登出url被转向到Server。

2.Server收到登出请求后,删除用户的cookie,并且从内存中取出之前 用户在所有的application中的登录的sessionId,依次向这些application发送消除session请求。并且删除之前内存中保 存的用户登录的ticket号和票据的信息。

3.各个application收到Server的请求后,被single sign out的Filter拦截,根据回传的sessionId号,清除用户session。

4.单点登出完毕。

Server端一直维护者用户登录信息的一个map,map中包含了用户登录生成 的ticket号和票据,用户登录的application及在其上的sesseionId等。单点登录完全由Server端承担,验证由 application与Server在后台(用户不可见)建立安全连接完成。

 

【CAS浏览器请求认证序列图】


其中:
*  ST:Service Ticket,用于客户端应用持有,每个ST对应一个用户在一个客户端上
* TGT:Ticket Granting Ticket,存储在CAS服务器端和用户cookie两个地方


【CAS服务器端登陆流程图】

 


  • 大小: 13.6 KB
  • 大小: 41.4 KB
分享到:
评论

相关推荐

    cas单点登录原理以及例子的搭建和实现

    SSO的效果在于,当用户访问其他已信任的服务时,CAS Server可以通过TGC直接验证用户身份,无需再次登录。如果TGC已失效,用户则需重新进行认证。 在实际配置中,例如使用Tomcat 5.5,需要为服务器创建证书库文件,...

    .net cas单点登录

    这个项目可能包含配置文件、控制器代码、视图模板和其他相关资源,展示了如何在实际应用中实现CAS单点登录功能。 综上所述,.NET CAS单点登录涉及到了身份验证、票证机制、客户端和服务器之间的交互等多个核心概念...

    CAS多数据库配置单点登录

    CAS多数据库配置单点登录 CAS(Central Authentication Service)是一种流行的单点登录解决方案,能够提供安全、...通过了解CAS单点登录的原理和配置步骤,可以更好地应用CAS单点登录,提高企业应用的安全性和可靠性。

    CAS单点登录(SSO)教程

    #### CAS单点登录原理与特点 CAS是一个开源项目,由Jasig组织维护,主要为Web应用提供单点登录功能。CAS的核心机制包括认证服务(CAS Server)和代理服务(CAS Client)两个部分: - **认证服务**:负责用户的认证处理...

    cas单点登录

    CAS(Central Authentication Service...总之,CAS单点登录是提高用户体验和安全管理的重要工具,其核心在于集中化的身份验证和票证管理。理解和掌握CAS的工作原理及实施要点,有助于在实际项目中有效地应用这一技术。

    cas 单点登录 耶鲁大学单点登录

    CAS单点登录的基本原理是通过一个中心认证服务器来进行用户的统一认证和管理。当用户首次访问某个受保护的应用时,该应用会重定向用户到CAS服务器进行认证;一旦用户通过CAS服务器认证,CAS会向用户提供一个Ticket...

    CAS实现sso单点登录原理

    "CAS实现sso单点登录原理" CAS(Central Authentication Service)是Yale大学发起的一个企业级的、开源的项目,旨在为Web应用系统提供一种可靠的单点登录解决方法(属于Web SSO)。CAS开始于2001年,并在2004年12月...

    CAS单点登录demo

    在本“CAS单点登录demo”中,我们将深入探讨CAS的工作原理、配置步骤以及如何实现客户端与服务器端的交互。 1. CAS工作原理: CAS的核心思想是集中式的身份验证,用户只需在一个地方进行登录,之后访问其他已经...

    cas实现单点登录

    #### 二、CAS单点登录原理概述 CAS单点登录的核心在于通过一个中心认证服务器管理用户的认证过程。当用户首次访问某个应用程序时,该应用程序会重定向用户到CAS服务器进行身份验证。验证成功后,CAS服务器会生成一...

    CAS 单点登录,tomcat配置SSL,及资源

    **CAS 单点登录原理与实现** ...通过以上步骤,你可以实现CAS单点登录,并在Tomcat服务器上配置SSL,确保通信安全。同时,正确集成CAS资源,能够让你的应用系统无缝接入CAS认证体系,提升用户体验。

    struts2+cas单点登陆例子

    Struts2和CAS单点登录(SSO)的集成是一个常见的Web应用安全实践,它允许用户在一个系统登录后,无须再次输入凭证就能访问其他相互信任的系统。在这个例子中,我们将深入探讨如何在MyEclipse环境下使用Struts2框架与...

    集成cas实现单点登录认证.zip

    2. 单点登录原理:SSO的核心思想是用户只需要进行一次身份验证,然后这个验证结果可以在所有信任的系统之间共享。当用户访问受保护的应用时,应用会重定向到认证中心进行验证,验证成功后,认证中心会返回一个票据给...

    CAS单点登录配置大全

    **CAS单点登录配置大全** CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On,SSO)协议。它允许用户通过一个统一的认证系统访问多个应用系统,而无需在每个系统...

    CAS单点登录例子,包含服务端和客户端

    综上所述,这个压缩包提供了一个完整的CAS单点登录实例,包括服务端和客户端的实现,可以帮助开发者理解并部署自己的CAS系统。通过深入研究和实践,你可以掌握如何利用CAS实现Web应用的安全、便捷的单点登录功能。

    CAS单点登录实例

    总的来说,CAS单点登录实例的搭建涉及多个步骤,从下载和配置必要的jar包,到修改配置文件,再到整合客户端应用,每一个环节都需要对CAS协议和SSO原理有深入理解。同时,安全性和用户体验也是实施过程中不可忽视的...

    cas单点才登出原理

    接下来,我们将详细探讨CAS单点登出的原理。 首先,理解SSO的基本流程: 1. 用户打开一个受CAS保护的应用系统A。 2. 应用系统A发现用户未登录,重定向到CAS服务器。 3. 用户在CAS服务器上输入凭证并验证通过。 4. ...

    CAS整合LDAP实现单点登录原理及部署

    CAS整合LDAP实现单点登录的原理及部署学习笔记,cas实现单点登录,ldap负责账户管理

    cas单点登录官方demo

    在这个"cas单点登录官方demo"中,我们可以深入理解CAS的工作原理和实现方法。 首先,单点登录的核心概念是“一次登录,全局通行”。用户在进入系统时只需要验证一次身份,之后在访问其他关联应用时,系统会自动识别...

Global site tag (gtag.js) - Google Analytics