CAS单点登录原理及实现

标签(空格分隔): 单点登录 CAS SSO


###目录

  • 概念介绍
  • 搭建流程
  • 原理分析

###概念介绍

  1. CAS介绍
    Central Authentication Service(缩写CAS)是一种针对万维网的单点登录协议。它的目的是允许一个用户访问多个应用程序,而只需提供一次凭证(如用户名和密码)。它还允许web应用程序在没有获得用户的安全凭据(如密码)的情况下对用户进行身份验证。“CAS”也指实现了该协议的软件包。
  2. SSO介绍
    Single sign-on(缩写为 SSO),又译为单点登录,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一退出(single sign-off)就是指,只需要单一的退出动作,就可以结束对于多个系统的访问权限。
  3. 主要特性
    开源的、多协议的 SSO 解决方案;Protocols:Custom Protocol、CAS、 OAuth、OpenID、RESTful API、SAML1.1、SAML2.0 等。
    支持多种认证机制:Active Directory、JAAS、JDBC、LDAP、X.509 Certificates等;
    安全策略:使用票据(Ticket)来实现支持的认证协议;
    支持授权:可以决定哪些服务可以请求和验证服务票据(Service Ticket);
    提供高可用性:通过把认证过的状态数据存储在TicketRegistry组件中,这些组件有很多支持分布式环境的实现,如:BerkleyDB、Default、EhcacheTicketRegistry、JDBCTicketRegistry、JBOSS TreeCache、JpaTicketRegistry、MemcacheTicketRegistry 等;
    支持多种客户端:Java、.Net、PHP、Perl、Apache, uPortal 等。
  4. SSO 的主要实现方式
    共享 cookies
    基于共享同域的 cookie 是 Web 刚开始阶段时使用的一种方式,它利用浏览同域名之间自动传递 cookies 机制,实现两个域名之间系统令牌传递问题;另外,关于跨域问题,虽然 cookies本身不跨域,但可以利用它实现跨域的 SSO 。如:代理、暴露 SSO 令牌值等。
    缺点:不灵活而且有不少安全隐患,已经被抛弃。
    Broker-based( 基于中间件 )
    这种技术的特点就是,有一个集中的认证和用户帐号管理的服务器。经纪人给被用于进一步请求的电子身份存取。中央数据库的使用减少了管理的代价,并为认证提供一个公共和独立的 "第三方 " 。例如 Kerberos 、 Sesame 、 IBM KryptoKnight (凭证库思想 ) 等。 Kerberos是由麻省理工大学发明的安全认证服务,已经被 UNIX 和 Windows 作为默认的安全认证服务集成进操作系统。
    Agent-based (基于代理人)
    在这种解决方案中,有一个自动地为不同的应用程序认证用户身份的代理程序。这个代理程序需要设计有不同的功能。比如,它可以使用口令表或加密密钥来自动地将认证的负担从用户移开。代理人被放在服务器上面,在服务器的认证系统和客户端认证方法之间充当一个 " 翻译 "。例如 SSH 等。
    Token-based
    例如 SecureID,WebID ,现在被广泛使用的口令认证,比如 FTP 、邮件服务器的登录认证,这是一种简单易用的方式,实现一个口令在多种应用当中使用。
    基于网关
    基于 SAML
    SAML(Security Assertion Markup Language ,安全断言标记语言)的出现大大简化了 SSO ,并被 OASIS 批准为 SSO 的执行标准 。开源组织 OpenSAML 实现了 SAML 规范。
  5. 登录流程
    访问服务:客户端发送请求访问应用系统提供的服务资源。
    定向认证:CAS客户端会重定向用户请求到CAS服务器。
    用户认证:用户身份认证。
    发放票据:CAS服务器会产生一个随机的 Service Ticket 。
    验证票据:CAS服务器验证票据 ST 的合法性,验证通过后,允许客户端访问服务。
    传输用户信息:CAS服务器验证票据通过后,传输用户认证结果信息给CAS客户端。
  6. 相关术语
    票据
    TGC(Ticket-granting cookie):存放用户身份认证凭证的 cookie ,在浏览器和 CAS Server 间通讯时使用,并且只能基于安全通道传输( Https ),是 CAS Server 用来明确用户身份的凭证;
    ST(Service ticket):服务票据,服务的唯一标识码 , 由 CAS Server 发出( Http 传送),通过客户端浏览器到达业务服务器端;一个特定的服务只能有一个唯一的 ST ;
    PGT(Proxy-Granting ticket):由 CAS Server 颁发给拥有 ST 凭证的服务, PGT 绑定一个用户的特定服务,使其拥有向 CAS Server 申请,获得 PT 的能力; ST是基于随机数生成的 只能使用一次,并且一段时间内失效;
    PGTIOU(Proxy-Granting Ticket I Owe You) : 作用是将通过凭证校验时的应答信息由 CAS Server 返回给 CAS Client ,同时,与该 PGTIOU 对应的 PGT 将通过回调链接传给 Web 应用。 Web 应用负责维护 PGTIOU 与 PGT 之间映射关系的内容表;
    PT(Proxy Ticket):是应用程序代理用户身份对目标程序进行访问的凭证;
    TGT(Ticket Granting ticket):票据授权票据,由 KDC 的 AS 发放。即获取这样一张票据后,以后申请各种其他服务票据 (ST) 便不必再向 KDC 提交身份认证信息 (Credentials) ;
    其他相关
    AS(Authentication service):认证用服务,索取 Credentials ,发放 TGT ;
    TGS(Ticket-granting service):票据授权服务,索取 TGT ,发放 ST ;
    KDC( Key Distribution Center ):密钥发放中心;
    ###搭建流程
    CAS服务端源码下载地址
    CAS服务war包下载
    搭建流程比较简单,这里做下简单介绍:
  7. 将服务war包下载后放入tomcat中部署运行
    这里有点需要注意下
    CAS默认使用的是HTTPS协议,如果对安全要求不高,可使用HTTP协议。下面就是修改一些配置,让CAS使用HTTP协议。
    (1)修改cas的WEB-INF/deployerConfigContext.xml
    找到下面的配置
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient"/>

这里需要增加参数p:requireSecure=“false”,requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用
(2)修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
找到下面配置

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"p:cookieSecure="true"p:cookieMaxAge="-1"p:cookieName="CASTGC"p:cookiePath="/cas" />

参数p:cookieSecure=“true”,同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。
参数p:cookieMaxAge="-1",是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。
我们这里将cookieSecure改为false , cookieMaxAge 改为3600
(3)修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml
找到下面配置

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />

我们这里将cookieSecure改为false , cookieMaxAge 改为3600
2. CAS客户端需要引入客户端包,添加如下pom:

<!-- cas -->
<dependency>  <groupId>org.jasig.cas.client</groupId>  <artifactId>cas-client-core</artifactId>  <version>3.3.3</version>
</dependency>

配置相应的web.xml:

 <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<listener>  <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>  <filter-name>CAS Single Sign Out Filter</filter-name>  <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>  <filter-name>CAS Single Sign Out Filter</filter-name>  <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>  <filter-name>CASFilter</filter-name>       <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>  <init-param>  <param-name>casServerLoginUrl</param-name>  <param-value>http://localhost:9100/cas/login</param-value>  <!--这里的server是服务端的IP -->  </init-param>  <init-param>  <param-name>serverName</param-name>  <param-value>http://localhost:9001</param-value></init-param>
</filter>
<filter-mapping>  <filter-name>CASFilter</filter-name>  <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>  <filter-name>CAS Validation Filter</filter-name>  <filter-class>     org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>  <init-param>  <param-name>casServerUrlPrefix</param-name>  <param-value>http://localhost:9100/cas</param-value>  </init-param>  <init-param>  <param-name>serverName</param-name>  <param-value>http://localhost:9001</param-value></init-param>
</filter>
<filter-mapping>  <filter-name>CAS Validation Filter</filter-name>  <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
<filter>  <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  <filter-class>  org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>  <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>  <filter-name>CAS Assertion Thread Local Filter</filter-name>       <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>  <filter-name>CAS Assertion Thread Local Filter</filter-name>  <url-pattern>/*</url-pattern>
</filter-mapping>

###原理分析
这里我们通过官方的两个流程图来熟悉下其原理:
基础模式

代理模式

CAS单点登录原理及实现相关推荐

  1. cas单点登录原理碎碎念

    2019独角兽企业重金招聘Python工程师标准>>> 也许有一天,你去面试,当面试官问你做cas的经验的时候,你会怎么描述? cas单点登录的原理? 单点登录是分为基于sessio ...

  2. CAS单点登录原理简单介绍

    1. SSO简介 1.1 单点登录定义 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统. ...

  3. CAS单点登录原理解析及相关配置

    1.基于Cookie的单点登录的回顾 基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中 ...

  4. CAS教程-第一篇-CAS单点登录原理解析

    转载自:http ://www.cnblogs.com/lihuidu/p/6495247.html 1,基于饼干的单点登录的回顾 基于Cookie的的单点登录核心原理: 将用户名密码加密之后存于饼干 ...

  5. CAS单点登录原理(包含详细流程,讲得很透彻,耐心看下去一定能看明白!)

    一.CAS简介和整体流程 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS ...

  6. cas单点登录原理与实现(整合springsecurity)

    一.cas原理分析 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.CAS是一种基于http协议的B/S应用系统单点 ...

  7. CAS单点登录的实现(二)

    这篇文章对CAS单点登录具体实现的一些步骤就行讲述,至于CAS单点登录的实现原理分析,请参看下面这篇文章: CAS单点登录原理分析(一) https://blog.csdn.net/qq_412582 ...

  8. CAS单点登录的实现

    这篇文章对CAS单点登录具体实现的一些步骤就行讲述,至于CAS单点登录的实现原理分析,请参看下面这篇文章: CAS单点登录原理分析(一) https://blog.csdn.net/qq_412582 ...

  9. cas跨域单点登录原理_CAS实现SSO单点登录原理

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  10. CAS单点登录3--服务端登录页个性化

    原理 cas的页面显示控制是集中在\WEB-INF\cas.properties中的cas.viewResolver.basename属性的,其默认值为default_views 所以cas会去cla ...

最新文章

  1. 一起ORACLE数据库中数据查询结果不一致问题的排查过程
  2. pytorch版本的bert使用笔记
  3. 1、oracle后台进程(数据字典V$BGPROCESS)
  4. JS面向对象一:MVC的面向对象封装
  5. TRIZ解决问题方法
  6. [Redux/Mobx] 你有了解Rxjs是什么吗?它是做什么的?
  7. n1运行linux,斐讯N1折腾记:运行 Linux 及优化
  8. Elasticsearch--分词-自定义扩展词库---全文检索引擎ElasticSearch工作笔记022
  9. js基础——cssText
  10. 英语学习—每天进步一丢丢系列(一)
  11. hadoop的基本搭建
  12. 诺基亚7 android 9,诺基亚7 Plus正式推送安卓9.0系统!
  13. LibreOJ β Round #2 E. 数论只会 GCD
  14. 373.查找和最小的K对数字
  15. 遗传算法的C语言设计
  16. dedecms织梦后台账号或密码忘记了怎么办?
  17. 千元平板乐Pad A1完整拆解视频
  18. UDP/TCP实时传输图像
  19. preg_replace与远程代码执行
  20. Chrome双开(同一个版本配置两个独立的浏览器,附图)

热门文章

  1. java搭建rtmp服务器,利用docker搭建RTMP直播流服务器实现直播
  2. 追赶法求解线性方程组matlab,追赶法求解三对角线性方程组Matlab编程
  3. 关于从asc格式到pcd格式的转换
  4. BRVAH官方使用指南(持续更新)
  5. 《Gradle实战》如何配置利用Maven本地仓库
  6. 可以在手机预览ps设计稿的软件
  7. SLAM入门-相机成像原理与公式推导
  8. 家庭组网 登录光猫超级账户(吉比特GM228-S)改桥接并使用路由器拨号上网 关闭QoS
  9. 解决方案-电子签章:金格科技
  10. Java数据脱敏框架