`
gzcj
  • 浏览: 289733 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SSO 原理浅谈

阅读更多

 SSO 是一个非常大的主题,我对这个主题有着深深的感受,自从广州 UserGroup 的论坛成立以来,无数网友都在尝试使用开源的 CAS Kerberos 也提供另外一种方式的 SSO ,即基于 Windows 域的 SSO ,还有就是从 2005 年开始一直兴旺不衰的 SAML

       如果将这些免费的 SSO 解决方案与商业的 Tivoli Siteminder RSA Secure SSO 产品做对比,差距是存在的。毕竟,商业产品的安全性和用户体验都是无与伦比的,我们现在提到的 SSO ,仅仅是 Web SSO ,即 Web-SSO 是体现在客户端;另外一种 SSO 是桌面 SSO ,例如,只需要作为 Administrator 登录一次 windows 2000 ,我便能够在使用 MSN/QQ 的时候免去登录的环节 ( 注意,这不是用客户端软件的密码记忆功能 ) ,是一种代理用户输入密码的功能。因此,桌面 SSO 是体现在 OS 级别上。

       今天,当我们提起 SSO 的时候,我们通常是指 Web SSO ,它的主要特点是, SSO 应用之间走 Web 协议 ( HTTP/SSL) ,并且 SSO 都只有一个登录入口。

       简单的 SSO 的体系中,会有下面三种角色:

       1 User (多个)

       2 Web 应用(多个)

       3 SSO 认证中心( 1 个)

       虽然 SSO 实现模式千奇百怪,但万变不离其宗:

l         Web 应用不处理 User 的登录,否则就是多点登陆了,所有的登录都在 SSO 认证中心进行。

l         SSO 认证中心通过一些方法来告诉 Web 应用当前访问用户究竟是不是张三 / 李四。

l         SSO 认证中心和所有的 Web 应用建立一种信任关系, SSO 认证中心对用户身份正确性的判断会通过某种方法告之 Web 应用,而且判断结果必须被 Web 应用信任。

2. CAS 的基本原理

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

       本节主要分析 CAS 的安全性,以及为什么 CAS 被这样设计,带着少许密码学的基础知识,我希望有助于读者对 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 协议能够适合任何语言编写的客户端应用。

 

 剖析协议就像剖析设计模式,有些时候,协议让人摸不着头脑。 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 的基本协议框架:

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?> 2.1.1 基础协议

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>

cas_protocol-1.jpg
                                                
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

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

于是, CAS Client 拿到了 PGT( PGTIOU-85…..ti2td ) ,这个 PGT TGC 同样地关键, CAS Client 可以通过 PGT 向后端 Web 应用进行认证。如下图所示, Proxy 认证与普通的认证其实差别不大

 

分享到:
评论

相关推荐

    Domino服务器SSO原理

    ### Domino服务器SSO原理详解 #### 一、引言 单点登录(Single Sign-On,简称SSO)是一种用户身份认证技术,允许用户通过一次登录即可访问多个应用系统,而无需再次输入凭证。这种机制提高了用户体验,同时也提升...

    SSO单点登录实现与实现原理

    本文将深入探讨SSO的实现原理,并结合提供的源代码进行详细讲解。 一、SSO基本原理 1. **中央认证服务(CAS)**:SSO的核心是中央认证服务,它负责验证用户的身份。当用户首次尝试访问受保护资源时,会被重定向到...

    跨域 SSO 原理与技术

    **一、SSO原理** SSO的核心原理是共享用户身份信息。当用户在主域登录成功后,系统会生成一个安全的认证令牌(Token),这个令牌包含了用户的身份信息。当用户尝试访问其他子域时,这些子域可以通过验证该令牌来...

    单点登录SSO原理.docx

    SSO的基本原理主要涉及两个核心概念:存储信任和验证信任。当用户成功登录到一个系统(认证系统)后,系统会产生一个信任凭证,并将其发送给用户。然后,用户在访问其他系统时,这些系统能够验证这个信任凭证,从而...

    单点登录SSO的实现原理

    单点登录SSO的实现原理 单点登录(SSO)是一种常见的技术实现原理,在多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。实现单点登录说到底就是要...

    sso的原理与java实现

    本文将深入探讨SSO的原理以及如何在Java环境中实现它。 ### SSO的原理 1. **票据概念**:在SSO中,票据(Ticket)是验证用户身份的关键。当用户成功登录到认证中心(Authentication Center,通常称为CAS)时,CAS...

    CAS SSO 原理

    综上所述,CAS SSO原理是通过中心化的认证服务器和分散的客户端协同工作,实现了用户只需一次登录即可访问多个应用系统的功能。这种设计既方便了用户,又简化了系统管理员的身份管理,同时保持了一定的安全性。然而...

    单点登陆系统SSO原理

    比如在媒体行业,常见的应用系统就有采编系统、排版系统、印刷系统、广告管理系统、财务系统、办公自动化系统、决策支持系统、客户关系管理系统和网站发布系统等。...特别是随着系统的增多,出错的可能性就会增加,受到...

    CAS实现sso单点登录原理

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

    Portal培訓教材之第7章_常见SSO原理及其实现_FromIBM(7)

    ### Portal培训教材之第7章_常见SSO原理及其实现 #### SSO概念与原理 单点登录(Single Sign-On, SSO)是一种让用户仅需登录一次即可访问多个相互信任的应用系统的解决方案。这种机制极大地提高了用户体验并简化了...

    单点登陆系统SSO原理.doc

    单点登录系统(Single Sign-On,SSO)是一种让用户在多应用系统环境下只需一次登录就能访问所有系统的身份验证机制。随着企业信息化的发展,各种独立的应用系统层出不穷,导致用户需要记住不同系统的用户名和密码,...

    【ASP.NET编程知识】浅谈谁都能看懂的单点登录(SSO)实现方式(附源码).docx

    【ASP.NET编程知识】浅谈谁都能看懂的单点登录(SSO)实现方式 单点登录(SSO)是一种允许用户在一个应用系统中登录后,无需再次认证即可访问其他相互信任的应用系统的机制。这提高了用户体验,简化了身份验证过程...

    Java进阶SSO单点登录技术CAS-快速上手与原理探究视频教程

    本课程主要通过CAS来实现SSO,本教程会从最基本的基础知识讲起,由浅入深再到实战,完成多应用的单点登录功能。 本课程内容如下: 1、 什么是SSO和CAS 2、 CAS Server服务端和客户端的搭建和配置 3、 单点登录和单...

    C#单点登陆组件源码SSO

    首先,理解C#中的SSO实现原理至关重要。SSO的核心在于票据(Ticket)的概念,当用户首次登录时,服务器会生成一个安全的票据,并将其返回给客户端。客户端在后续请求中携带这个票据,服务器通过验证票据来确认用户的...

    spring boot 实现SSO单点登陆

    spring boot整合spring security 实现SSO单点登陆 完整DEMO. ...2、先后启动SsoServer、sso-resource、sso-client1、sso-client2 3、访问http://sso-taobao:8083/client1/ 或 http://sso-tmall:8084/client2/

    SSO单点登录

    ### SSO单点登录原理及CAS Server配置详解 #### 一、SSO简介 SSO(Single Sign-On,单点登录)是身份管理领域的重要组成部分,它允许用户在一个应用程序中进行一次身份验证后,无需再次登录即可访问同一组织内其他...

    java web sso 实现

    1. **SSO原理**: SSO的核心思想是用户只需一次登录,就能在多个应用之间无缝切换。这通常通过共享身份验证信息和会话状态来实现。在Java Web环境中,常见的实现方式包括使用票据(Ticket)或令牌(Token)。 2. *...

Global site tag (gtag.js) - Google Analytics