基本概念

SSO(Single Sign On)单点登录,是在多个应用系统中,用户只需要登录一次就能访问所有相互信任的应用系统。它包括将这次的主要登录映射到其他应用中用户同一个用户的登录机制。

SSO可以分为Web SSO和桌面SSO,Web SSO体现在客户端,桌面SSO则是操作系统级别的SSO(如登录了Windows就可以使用QQ)。

现在我们所讲的SSO,通常是Web SSO,也就是SSO应用间走Web协议(HTTP/SSL),并且多个应用共享一个SSO入口。

原理介绍

系统角色

User

User可以有多个,User访问Web应用并被SSO认证中心鉴权和授权。

Web应用

Web应用可以有多个,并且受SSO认证中心的保护,是User访问的目标。

SSO认证中心

仅包含一个,用户未授权的访问请求会被重定向到SSO认证中心。

CAS

CAS是耶鲁(Yale)大学发起的一个开源项目,在Java Web SSO中,CAS占据了大约八成的份额,简单时效且足够安全。

CAS的体系结构

CAS Server

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

CAS Server 会处理用户名/密码等凭证,并可能从数据库或其他来源检索用户名和密码,对于这种方式,CAS提供灵活的接口/实现分离方式,意味着CAS Server可以支持任何的认证方式,并且与CAS协议分离。

CAS Client

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

目前CAS Client支持非常多的客户端(Java/PHP/.Net)等。

CAS协议

CAS协议有从v1到v3的版本,在v2版本中开始支持了XML,在v3版本中支持了AOP,因此对于使用Spring开发的项目来说是非常友好的。

CAS协议的基础思想都是基于Kerberos的票据方式。

基础协议

图1 基础模式

  1. CAS Client以Filter的形式保护Web应用的受保护资源,过滤从客户端过来的每一个请求(Step 1)。
  2. CAS Client分析HTTP请求中是否包含Service Ticket,如果没有则重定向到CAS Server(Step 2)。
  3. 用户认证过程,如果用户提供了正确的Credentials,CAS Server会产生随机的Ticket,然后缓存该Ticket(Step3),并生成TGC(Ticket Grant Cookie)给User浏览器。
  4. 并重定向用户到CAS Client并携带刚才产生的Ticket(Step4)。
  5. CAS Client与CAS Server通过Ticket完成身份认真(Step4和Step5)。
  6. 验证成功后,CAS Client对当前Request用户进行服务。
  7. 用户再次访问时携带TGC,CAS Server会判断该Cookie的有效性并决定是否再次验证。

CAS代理模式

基础协议已经能够满足绝大多数的场景,但是对于通过service1访问service2这种场景就无能为力了,如果我们对service2也进行验证,从用户角度来说,将会看到频繁的重定向,因此引入了Proxy(代理)模式,由CAS Client代理用户去访问其他Web应用。

代理的前提是需要CAS Client拥有身份信息(类似凭据),用户持有的TGC(Ticket Granted Cookie),而代理持有的是PGT(Proxy Granted Ticket),凭借TGC用户可以免登陆获取其他应用的Service Ticket,同样的,通过PGT,Web应用可以代理用户实现后端认真而无需前端的用户参与。

如何获取PGT?

如下图示,CAS Client在基础协议之上,提供了一个额外的PGT URL给CAS Server,CAS Server通过该接口提供PGT给CAS Client。

图2 Proxy模式

与基础协议不同,在Proxy模式中起作用的是PT(Proxy Ticket),基础模式使用的是ST(Service Ticket)。

图3 代理模式的访问模式

当helloservice需要helloservice2的数据时,helloservice首先使用自己保存的PGT向CAS Server获取PT。

当获取到PT之后,helloservice携带该PT向helloservice2请求数据。

Helloservice2使用该PT向CAS Server验证请求,CAS Server返回验证结果。

Helloservice2此时知道可以合法的为Helloservice服务,从而返回数据。

业界方案

JA-SIG CAS

开源SSO实现中最为成熟的一个,良好的安全性和易用性。

而且CAS客户端有Java,.Net,以及PHP版本,良好支持了现有产品,SSO将会基于CAS进行开发。

http://www.jasig.org/cas

JOSSO

较早的一个实现,但与技术绑定过深,缺乏良好的适用性和文档。

CoSign

类似于CAS的一个实现,CAS Server基于GCI,在C/C++项目中使用较多。

WebAuth

非常早期的SSO方案,使用Perl编写,对Java的支持性很差。

OpenSSO

被甲骨文收购,不再提供支持

CAS安全性

CAS的安全性是非常重要的,从CAS V1到V3,其都依赖与SSL,它假定了用户在一个非常不安全的环境中使用SSO,HTTP传送的密码和Ticket票据都是不安全的。

TGC/PGT的安全性

对于一个CAS用户来说,最重要的事情是保护他的TGC,如果TGC被黑客获取,黑客就会使用该TGC访问所有的应用。

对SSO来说,这种风险是巨大的,因为SSO具有一种门槛效应,一旦登录就会获取相关服务的所有权限。

TGC保存在客户端,其安全性完全有SSL保证。

TGC也有自己的存活周期,在CAS的web.xml中,可以通过grantingTimeout来设置CAS TGC的存活周期。

该周期需要慎重设置,既不影响用户体验,不能带来过高的安全风险(避免被盗用)。

Service Ticket/Proxy Ticket的安全性

Service Ticket/Proxy Ticket是通过HTTP传送的,因此网络中的其他人是可以嗅探到他人的Ticket的。

CAS协议从以下几个方面让ST/PT更加安全。

  1. Service Ticket只能使用一次
  2. Service Ticket一段时间后失效

通过在web.xml中配置如下参数。

<context-param>
<param-name>edu.yale.its.tp.cas.serviceTimeout</param-name>
<param-value>300</param-value>
</context-param>
  1. ST/PT的生成必须足够随机

避免被猜出生成规则

SAML

SAML是OASIS制定的安全性断言标记语言,用于在复杂环境下交互用户的身份识别信息,正在被越来越多的商用产品支持。

SAML与SOAP一样,不考虑具体的传输协议,实际上可以与HTTP/SSL/JMS等任何传输协议捆绑。对于复杂的服务构型,由于不同服务可能有不同的协议,使用CAS将无法完成,因为CAS是基于HTTP/SSL上的,只有SAML能完成这项任务,因为其与传输协议无关。

最后,SAML是一种SSO标准而CVS是一种SSO实现,从CAS的RoadMap中可以看出,其也将很快支持SAML。

单点登录系统构建之二——SSO原理及CAS架构的更多相关文章

  1. 单点登录系统构建之一——基础知识(Kerberous/SAML)

    http://web.mit.edu/kerberos/ Kerberos Kerberous是一个网络身份验证协议,它被设计为客户端/服务器提供基于密钥的强加密机制.该协议最初由MIT实现并被广泛商 ...

  2. SSO单点登录的发展由来以及实现原理【转】

    单点登录以及权限,在很早之前都有写过,不过都比较简单,今天就具体说一下,以及下一步要做的 1.web单系统应用 早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的, ...

  3. 【SSO】单点登录系统

    一.单点登录系统介绍 对于一个开发项目来说,每个项目都必不可少要有登录的这个功能.但是随着项目的变大,变大,再变大.系统可能会被拆分成多个小系统,咱们就拿支付宝和淘宝来说,咱们在淘宝上购物,然后就可以 ...

  4. 单点登录系统SSO实现

    前些天被问到单点登录了,而据我当时做的这个模块两年了,现在重新温习并记录下,方便以后快速回忆起来 一.什么是单点登录系统 SSO全称Single Sign On.SSO是用户只需要登录一次就可以访问所 ...

  5. 单点登录系统(SSO)之CAS(中央认证服务)

    SSO(Single Sign On)单点登录系统,是在多个系统中值要求只要登录一次,就可以用已登录的身份访问多个系统,去掉了每次访问不同的系统都要重新登录的弊端. CAS(中央/集中认证服务):Th ...

  6. SSO - 我们为何需要单点登录系统

    SSO,Single Sign On,也就是单点登录,保证一个账户在多个系统上实现单一用户的登录 现在随着网站的壮大,很多服务会进行拆分,会做SOA服务,会使用dubbo做微服务,或者简单的小型分布式 ...

  7. sso单点登录系统(解决session共享)

    场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...

  8. 单点登录系统---SSO

    1.------------------SSO介绍--------------------------------- 有什么卵用?搞什么飞机的? 大家看看这个图,一个系统是没有问题.如果是分布式的系统 ...

  9. 单点登录系统(SSO)的开发思路

    单点登录并不是一个新鲜的玩意儿,比较官方的解释是企业业务整合的解决方案之一,通俗来讲SSO就是一个通用的用户中心,国内比较流行的UCenter就是一套单点登录解决方案.而近期以CSDN明文存储用户密码 ...

随机推荐

  1. 2014_GCJ_A

    题目链接:http://code.google.com/codejam/contest/2984486/dashboard#s=p0 最想吐槽的是想些DFS过小数据,居然写不出来,不知道我这半年的AC ...

  2. static_cast和reinterpret_cast

    static_cast和reinterpret_cast 相同点:都是暴力转换,从一个类型转换为另一个类型,对于类指针不会保证安全性   static_cast和reinterpret_cast的区别 ...

  3. iOS富文本-NSAttributedString简单封装

    直接调用系统的写起来比较麻烦,封装一下 因为要简单所以就写类方法 WJAttributeStyle 基类 ) {         ; i < styles.count; i ++) {      ...

  4. POJ 1989

    #include <iostream> #define MAXN 10005 using namespace std; bool mark[MAXN]; int main() { //fr ...

  5. Windows 7,64位机器上安装DB2 7.2+FP7

    1.要想在Windows 7,64位机器上安装DB2 7.2+FP7,注意:1)拷贝所有安装文件到本地2)设置setup.exe文件兼容windows 20003)使得users用户勾选“完全控制”权 ...

  6. hdu 4767 Bell

    思路:矩阵快速幂+中国剩余定理!! 查资料得到2个公式:             1) B[n+p] = B[n] + B[n+1] mod p ;             2) B[p^m+n] = ...

  7. zoj 2290 Game 博弈论

    思路:HDU有过类似的题目,也就是谁面对FIB数,就处于必败状态. 再求第二问的时候要注意不一定要在一步之内就让对手处于必败状态,可以多步进行, 这个过程可以用递归实现. 代码如下: #include ...

  8. JS之数组

    1.数组的定义: (1)字面量:  var arr = [1, 2, 3];  (2) new:   var arr = new Array(1, 2, 3);(using new and don't ...

  9. 微软VSS的超级BUG

    发现问题:今天一个新同事,无意中发现他直接就登录进VSS了,并且还是“admin”用户: 解决问题:于是开始在网上找度娘和谷歌帮忙,真是不查不要紧,一查吓一跳,VSS本身就存在这个bug,并且是一个超 ...

  10. lintcode:数字组合I

    数字组合I 给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T.C中的数字可以无限制重复被选取. 例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为: [7], ...