SSO实现机制

引言

单点登录有许多开发商提供解决方案,本文以yale大学SSO开源项目CAS为例,介绍单点登录实现机制。

术语解释

SSO-Single Sign On,单点登录

TGT-Ticket Granting Ticket,用户身份认证凭证票据

ST-Service Ticket,服务许可凭证票据

TGC-Ticket Granting Cookie,存放用户身份认证凭证票据的cookie

SSO原理概述

SSO组件主要包含:SSO服务器、SSO客户端。SSO服务器主要负责完成用户认证、提供单点登录服务;SSO客户端部署在应用系统(Web应用端与C/S架构模式应用端),用户请求访问应用系统的受保护资源时,需要将请求转向SSO服务器进行身份认证、单点登录服务相关处理。

SSO服务器接口

uri 说明
/login
凭证请求器,参数如下:

service:客户端要访问的应用的标识;

renew:如果设置这个参数,sso将被绕过;不支持renew和gateway同时存在,若存在则忽略gateway;

gateway:如果设置这个参数,CAS将不再问客户端要凭证。

凭证接收器,参数如下:

service:客户端要访问的应用的标识;CAS在认证成功后将它的url转发给客户端;

warn:在认证转发给其他服务前,客户端必须给予提示。

/logout 单点退出,释放cas单点登录的session
/proxyValidate SSO服务器验证票据的合法性
   
   

SSO单点登录主要原理

SSO单点登录访问流程主要有以下步骤:

1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。

3. 用户认证:用户身份认证。

4. 发放票据:SSO服务器会产生一个随机的Service Ticket。

5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。

6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

7. 单点退出:用户退出单点登录。

SSO单点登录访问总共会涉及以上6个步骤,但用户不同的SSO访问可能只会涉及到几个步骤,我们把SSO访问流程我们分为5种实例情况介绍:登录点首次访问、登录点二次访问、单点首次访问、单点二次访问、单点退出。这5种实例应当可以比较全面地展示SSO访问实现的机制。

注:文中存在以下术语词汇,解释如下。

登录点:首次进入子系统登录的站点在本文中称为登录点。

单点:用户已经登录,而后再访问另一子系统的站点在本文中称为单点。

登录点首次访问:是指首次访问应用系统,进入登录页面的过程。登录点二次访问:是指在上述”登录点“,再次进行正常的访问”登录点“的过程。

单点首次访问:是指已经在上述“登录点”登录后,再首次访问另一个子系统进行访问的过程。单点二次访问:是指已经在上述“单点首次访问",再次进行正常的访问”单点“的过程。

登录点首次访问

说明:用户首次访问”登录点“System1,session中没有用户上下文,于是将请求地址包装为service参数,转向SSO服务器”定向认证“,SSO服务器返回登录页面,用户录入用户名、密码等凭证信息,提交给SSO服务器,SSO服务器进行认证,认证成功后,生成TGT,再根据TGT发放票据ST,返回响应给浏览器,浏览器带着票据ST的service参数的请求,请求SSO服务器验证票据,验证票据成功后,返回给浏览器用户信息(通过cas协议约定的xml格式传递数据解析转换成需要的用户信息),设置session用户上下文、cookie中设置TGC。

登录点二次访问

说明:用户在上述“登录点首次访问”登录成功后,再次访问登录点的应用服务时,判断session中已经存在用户上下文,就不再拦截,直接转向到需要访问的目标服务资源。

单点首次访问

说明:同上述“登录点首次访问”的说明。

单点二次访问

与“登录点二次访问”相似。

单点退出

说明:用户单点登录后,有一个全局的过滤器SingleSignOutFilter对访问的安全资源的ticket,sessionid记录到一个映射表,我们暂称其为票据会话映射表。在一个子系统(如system1)执行单点退出"/logout"时,先销毁system1的本地session,再向SSO服务器发送单点退出请求,SSO服务器接到这个请求后,将用户认证票据TGT销毁,清除浏览器cookie中的TGC,再读取票据会话映射表,将其对应的票据ST,session全部销毁。这样用户再访问时各子系统时,是单点退出状态,就需要重新登录。

我们再详细从CAS源码中看看SSO单点退出实现机制。

SSO客户端涉及源码类图如下:

一般web应用中一般部署在web.xml文件中,单点退出相关配置如下:

<listener>         <listener-class>            edu.yale.its.tp.cas.client.session.SingleSignOutHttpSessionListener         </listener-class>     </listener>     <filter>         <filter-name>SingleSignOutFilter</filter-name>         <filter-class>             edu.yale.its.tp.cas.client.session.SingleSignOutFilter         </filter-class>     </filter>         <filter>         <filter-name>CasLogoutProxy</filter-name>         <filter-class>             edu.yale.its.tp.cas.exclient.SimpleServerLogoutHandler         </filter-class>         <init-param>             <param-name>logoutUrl</param-name>             <!--CAS Server  Logout URL-->             <param-value>                 http://localhost:8080/ssoserver/logout             </param-value>         </init-param>
        <init-param>             <!--CAS Client Application URL-->             <param-name>serviceUrl</param-name>             <param-value>                 http://localhost:8070/ssoclient/index.jsp             </param-value>         </init-param>             </filter> ...     <filter-mapping>            <filter-name>CasLogoutProxy</filter-name>             <url-pattern>/logout</url-pattern>         </filter-mapping>        <filter-mapping>         <filter-name>SingleSignOutFilter</filter-name>         <url-pattern>/*</url-pattern>     </filter-mapping>

说明:我们看到单点退出的相关类结构,web.xml配置了单点退出的相关类(1个监听器SingleSignOutHttpSessionListener,2个过滤器SingleSignOutFilter,SimpleServerLogoutHandler)。实现利用了session存储机制,SessionStoreManager是个单例类,用于管理session的存储、删除;SessionMappingStorage是session的存储、删除的执行者,可以看到实际存储的结构是一个artifactId、sessionId为名值对的HashMap表;监听器SingleSignOutHttpSessionListener的作用是session销毁时,调用session管理单例类SessionStoreManager进行session的删除销毁;SingleSignOutFilter的作用有2个:一个是在单点访问拦截安全资源时调用单例类SessionStoreManager存储session,另一个是在单点退出时调用单例类SessionStoreManager删除session;SimpleServerLogoutHandler的作用是将客户端的退出请求转发到SSO服务器端,集中处理做各个子系统的单点退出。

SSO服务器端单点退出涉及源码类图如下:

说明:用户发送单点退出请求,转向到SSO服务器的单点退出服务接口/logout,SSO服务器将每次web请求构造一个继承类AbstractWebApplicationService的SimpleWebApplicationServiceImpl的实例,单点退出执行logOutOfService方法,销毁票据、session等处理。

时间: 2024-10-09 06:37:57

SSO实现机制的相关文章

新浪微博SSO登陆机制

原文地址: http://blog.sina.com.cn/s/blog_7a09f0920101agni.html 最近在使用sina微博时,经常性交替使用 weibo.com 和 t.sina.cm.cn进入我的微博.发现当我在 t.sina.com.cn中登录之后,直接切换至weibo.com,这时候在 weibo.com是已经登录的,当我在 weibo.com进行注销之后,再切换至 t.sina.com.cn,这时候在 t.sina.com.cn也已经是注销的状态了. 对于SSO的实现方

Teamcenter Web 端自动登录 (SSO)

原生的机制 Teamcenter 2007 的web 端, 本身提供了SSO 的机制. 原生的机制使用 Java Applet 的方式获取浏览器端所在的机器登录的用户名,使用这个用户名进行登录, 而无需密码. 架构设计如下: 不需要安装插件的验证 使用以上方式进行验证,在客户端的话就必须要安装 JRE. 插件安装本身就是一个扰人的动作, 而且对于各浏览器来说, 相关的插件安装机制又有不同. 比如对于目前的Chrome 的版本来说, 默认状况下, 不过你本地是否有安装JRE , 都会提示你安装最新

Oauth2

移动应用的第三方平台登录在服务端的授权验证 如今,很多移动应用在做用户注册/登录的时候,为减少用户的交互成本,会考虑引入常用的第三方平台的开放登录授权来快速的将用户倒流到自己的平台中.在原来的第三方登录中,很多是采用基于 Web 的 Oauth 登录授权机制,在这种情况下,用户需要在 APP 弹出的网页中输入第三方平台的账号和密码进行登录,然后授权当前应用允许访问自己的账号.而现在更多的则采用的是所谓 SSO 授权机制,用户在点击第三方登录按钮后,应用会将用户引导至对应的第三方应用中,接下来只需

CAS 实现单点登录(SSO)数据库查询认证机制-xml方式(三)

继前面介绍过基于CAS实现单点登录(SSO)的实例演示,演示过程中服务端认证机制采用的是默认配置即CAS Servier默认用户名和密码一致即可登录成功,那么本文将侧重于应用方面,真正通过查询用户名密码来进程验证用户是否可以登录. CAS Server添加相关的jar包 需要在web项目的lib下添加两个包:cas-server-support-jdbc-x.x.x.jar和 mysql-connector-java-x.x.x-bin.jar(具体版本号根据情况而定) 修改CAS Server

CAS 实现单点登录(SSO)数据库查询认证机制-自定义编码方式(四)

通过xml配置方式实现数据库查询认证,的确简单但是不够灵活.但是如果登录验证逻辑稍微复杂些,可能通过这种配置方式就不能满足需求了,比如:当用户登录时,需要判断该用户是否绑定了邮箱,如果未绑定,拒绝登录并给出提示信息. 遇到类似的情况,就需要使用自定义登录来完成,并且给出的提示信息也需要是自定义的.  自定义登录验证(默认实现QueryDatabaseAuthenticationHandler) CAS内置了一些AuthenticationHandler实现类,如下图所示,在cas-server-

sso单点登陆

SSO在我们的应用中非常常见,例如我们在OA系统登录了,我们就可以直接进入采购系统,不需要再登录了,这样使我们非常方便.现在网上也有很多实现方法,于是乎我也想写一个看看.我主要用到的是cookie的机制.在此,分享给大家, 同时提供源代码下载. 进入主题: 工程说明 SSO的实现一般是会有一个SSO Server,也会叫认证中心,同时也会有被认证的系统,如OA系统.采购系统等,他们就相当于SSO Server的client. 为了更形象体现SSO,我写的SSO是有三个工程:一个SSO Serve

Atitit. 单点登录sso 的解决方案 总结

Atitit.  单点登录sso 的解决方案 总结 1. 系统应用场景and SSO模式选型 2 2. 系统应用的原则与要求 2 2.1. 开发快速简单::绝大部分系统来说,开发快速简单为主 2 2.2. 支持token交换,这样有利于集成先有的系统模块无需大改动,仅仅需要改动登陆模块.. 2 2.3. 支持用户名映射.当多个子系统username不同时候儿 2 3. 脱机验证sso (分散认证,类似护照的识别方式) 2 3.1. 适合场景:: 高性能场景,支持单方面改造 3 3.2. 缺点::

可跨域的单点登录(SSO)实现方案

可跨域的单点登录(SSO)实现方案 SSO简介 定义: 传统的单站点登录访问授权机制是:登录成功后将用户信息保存在session中,sessionId保存在cookie中,每次访问需要登录访问的资源(url)时判断当前session是否为空,为空的话跳转到登录界面登录,不为空的话允许访问. 单点登录是一种多站点共享登录访问授权机制,访问用户只需要在一个站点登录就可以访问其它站点需要登录访问的资源(url).用户在任意一个站点注销登录,则其它站点的登录状态也被注销.简而言之就是:一处登录,处处登录

Session机制详解

虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答.     一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的. session,中文经常翻译为会话,