为什么要 SSO?


企业的信息化过程是一个循序渐进的过程,这就造成在企业的不同时期,根据业务和发展需要,构建了多个应用程序,而这些应用程序在功能、设计和技术可能都有所不同,就形成了各自独立的用户库和用户认证体系。于是,在访问不同的应用系统时,需要记录/输入的用户名和密码(不同时期建立的系统,用户名和密码的规则可能还不一样;要是忘了,还得让人重置;如果人员发生变动,那所有的系统都要改)。这太麻烦了。

如果引入单一用户登录的解决方案,建立一套统一的、完善的、科学的单点登录系统,每个用户只需记录一个用户名和密码,登录一个平台后即可实现各应用系统的透明跳转,而且实行统一的用户信息管理系统(系统管理员可以通过平台接口同步更新至各个应用系统,实现单次维护全公司同步变更),就可以大幅度提高工作效率。

单点登录在现在的软件系统已经很常见,比如,阿里集团,有很多应用系统,有淘宝、有天猫、有支付宝、有阿里旺旺,只要登录一次,其他的所有系统都可以使用,再比如,像有道云笔记、Evernote,它们有网页版,还有客户端,只要登录一个,另一个就能自动登录~

什么是 SSO?


单点登录,Single Sign-On,简写为 SSO,是一个用户认证的过程,允许用户一次性进行认证后,就可访问系统中不同的应用;而无需要访问每个应用时,都重新输入用户和密码。IBM 对 SSO 有一个形象的解释“单点登录、全网漫游”。

SSO 的好处?


SSO 将一个企业内部所有域中的用户登录和用户帐号管理集中到一起,SSO 的好处显而易见:

  • 减少用户在不同系统中登录耗费的时间,减少用户登录出错的可能性

  • 实现安全的同时避免了处理和保存多套系统用户的认证信息

  • 减少了系统管理员增加、删除用户和修改用户权限的时间

  • 增加了安全性:系统管理员有了更好的方法管理用户,包括可以通过直接禁止和删除用户来取消该用户对所有系统资源的访问权限

对于内部有多种应用系统的企业来说,单点登录的效果是十分明显的。很多国际上的企业已经将单点登录作为系统设计的基本功能之一。

解决方案


单点登录,简单说,在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是,在一个系统登录一次,其他所有系统都信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,用户不仅会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯。实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下几个:

  • 存储信任
  • 验证信任

只要解决了以上的问题,达到了开头讲得效果就可以说是 SSO。SSO 的实现机制大体分为 Cookie 机制和 Session 机制两大类。

Cookie 机制

最简单实现 SSO 的方法就是用 Cookie,实现流程如下所示:

图 1 Cookie 机制

上面方案是把信任存储在客户端的 Cookie 里,这种方法虽然实现方便但立马会让人质疑两个问题:

  • Cookie 不安全
  • 不能跨域免登

对于第一个问题一般都是通过加密 Cookie 来处理;第二个问题是硬伤,其实这种方案的思路是把这个信任关系存储在客户端,要实现这个也不一定只能用 Cookie,用 flash 也能解决,flash 的 Shared Object API 就提供了存储能力。

目前好点的开源单点登录产品 CAS(Central Authentication Service)就是采用 Cookie 机制。CAS 最早由耶鲁大学开发。2004年12月,CAS 成为 JA-SIG 中的一个项目。JA-SIG 全称是 Java Architectures Special Interest Group。CAS 的优点,如配置简单、客户端支持广泛、技术成熟等。

图 2 CAS

CAS 涉及 5 种票据: TGC 、 ST 、 PGT 、 PGTIOU 、 PT 。Ticket-granting cookie(TGC),是存放用户身份认证凭证的 cookie ,在浏览器和 CAS Server 间通讯时使用,并且只能基于 Https,是 CAS Server 用来明确用户身份的凭证;Service ticket(ST),是服务票据,服务的惟一标识码 , 由 CAS Server 通过 HTTP 发出,通过客户端浏览器到达业务服务器端。一个特定的服务只能有一个惟一的 ST; Proxy-Granting ticket(PGT),是由 CAS Server 颁发给拥有 ST 凭证的服务, PGT 绑定一个用户的特定服务,使其拥有向 CAS Server 申请,获得 PT 的能力; Proxy-Granting Ticket I Owe You(PGTIOU),是将通过凭证校验时的应答信息由 CAS Server 返回给 CAS Client ,同时,与该 PGTIOU 对应的 PGT 将通过回调链接传给 Web 应用。Web 应用负责维护 PGTIOU 与 PGT 之间映射关系的内容表; Proxy Ticket(PT),是应用程序代理用户身份对目标程序进行访问的凭证。

CAS 验证过程:

  • 应用程序一开始,通常进入原来的登陆界面,直接转向 CAS 自带的登录界面(当然也可以在原来登录界面增加登录按钮,来跳转)。如果用户希望,也可以直接进入 CAS 的登录界面登录,再启动其他应用程序。不过这种方式主要用于测试环境)。
  • CAS 的登录界面处理所谓的“主体认证”。它要求用户输入用户名和密码,就像普通的登录界面一样。
  • 主体认证时,CAS 获取用户名和密码,然后通过某种认证机制进行认证。通常认证机制是 LDAP(Lightweight Directory Access Protocol)。
  • 为了进行以后的单点登录,CAS向浏览器送回一个所谓的“内存cookie”。这种cookie并不是真的保存在内存中,而只是浏览器一关闭,cookie就自动过期。这个cookie称为“ticket-granting cookie”,用来表明用户已经成功地登录。
  • 认证成功后,CAS 服务器创建一个很长的、随机生成的字符串,称为“Ticket”。随后,CAS将这个ticket和成功登录的用户,以及服务联系在一起。这个ticket是一次性使用的一种凭证,它只对登录成功的用户及其服务使用一次。使用过以后立刻失效。
  • 主体认证完成后,CAS将用户的浏览器重定向,回到原来的应用。CAS客户端,在从应用转向CAS 时,同时也会记录原始的URL,因此 CAS 知道谁在调用自己。CAS 重定向的时候,将ticket 作为一个参数传递回去。
  • 例如,原始应用的地址是 http://www.itil.com/,转向 CAS 服务器的单点登录页面 https://secure.oa.com/cas/login?service=http://www.itil.com/auth.aspx;
  • CAS 完成主体认证后,会使用 http://www.itil.com/authenticate.aspx?ticket= ST-2-7FahVdQ0rYdQxHFBIkKgfYCrcoSHRTsFZ2w-20 这个 URL 进行重定向 。
  • 收到 ticket 后,应用程序需要验证 ticket。这是通过将 ticket 传递给一个校验 URL 来实现的。校验 URL 也是 CAS 服务器提供的。
  • CAS 通过校验路径获得了 ticket 后,通过内部的数据库对其进行判断。如果是有效性,则返回一个 NetID 给应用程序。
  • 随后 CAS 将 ticket作废,并且在客户端留下一个 cookie。
  • 以后,其他应用程序就使用这个 cookie 进行认证(当然通过 CAS 的客户端),而不再需要输入用户名和密码。

这种方式,以前见的比较多,现在大都用 Session 机制,别的不说,Cookie 在客户端始终是个安全隐患,不涉及钱,还能容忍,要是涉及转账之类的,出问题怎么算呢,不能简单一句:你电脑中毒了,被黑了,你自己的问题,这么简单吧,而且,用 CAS 时,会重定向,如果网络不好,能看到明显的延迟和卡顿~

Session 机制

一般大型系统会采取在服务端存储信任关系的做法,也就是 Session 机制实现单点登录(毕竟像上面客户端的 Cookie 方式,安全性实在是差了点),实现流程如下所示:

图 3 Session 机制

上面方案是把信任关系存储在单独的 SSO 系统(暂且这么称呼它)里,说起来只是简单地从客户端移到了服务端,但其中几个问题需要重点解决:

  • 如何高效存储大量临时性的信任数据
  • 如何防止信息传递过程被篡改
  • 如何让SSO系统信任登录系统和免登系统

对于第一个问题,一般可以采用类似与 memcached 分布式缓存的方案,既能提供可扩展数据量的机制,也能提供高效访问。

而对第二个问题,一般采取数字签名的方法,要么通过数字证书签名,要么通过像 md5 方式,这就需要SSO系统返回免登URL的时候对需验证的参数进行md5加密,并带上 token一起返回,最后需免登的系统进行验证信任关系的时候,需把这个token传给SSO系统,SSO系统通过对token的验证就可以辨别信息是否被改过。

对最后一个问题,可以通过白名单来处理,说简单点只有在白名单上的系统才能请求生产信任关系,同理只有在白名单上的系统才能被免登录。

单点登录 SSO(Single Sign-On)的实现原理的更多相关文章

  1. php单点登录SSO(Single Sign On)的解决思路

    一.什么是单点登录 解释:登录一个系统后,其它系统无需再次登录,即可进入. 二.举个例子: 你登录了淘宝,然后你进入天猫,发现你不用登录了.这时你要注意到,淘宝跟天猫可是完全不一样的域名. 你登录淘宝 ...

  2. java:sso(单点登录(single sign on),jsp文件动静态导入方式,session跨域)

    1.jsp文件导入: 2.session跨域: 3.sso(单点登录(single sign on): sso Maven Webapp: LoginController.java: package ...

  3. 单点登录(Single Sign On)解决方案

    单点登录(Single Sign On)解决方案 需求 多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. A 网站和 B 网站是同一家公司的关联服务.现在要求,用户只要在其中一个网 ...

  4. 源代码解读Cas实现单点登出(single sign out)功能实现原理

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  5. 源代码解读Cas实现单点登出(single sign out)功能实现原理--转

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  6. 自己动手搭建 CAS(Central Authentication Service) 环境,为了单点登录(Single Sign On , 简称 SSO )

    介绍 刚刚搭建 CAS 成功了,现在记录下来,怕以后忘记,同时也给需要帮助的人.CAS 搭建需要服务端和客户端,服务端是 Java 写的,如果自己搭建则需要安装与配置 Java 环境.客户端可以是多种 ...

  7. .NET基于Redis缓存实现单点登录SSO的解决方案[转]

    一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...

  8. 单点登录SSO

    转载自 http://www.blogjava.net/xcp/archive/2010/04/13/318125.html   摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当 ...

  9. .NET基于Redis缓存实现单点登录SSO的解决方案

    一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...

  10. 十六、【适合中小企业的.Net轻量级开源框架】EnterpriseFrameWork框架核心类库之单点登录SSO

    回<[开源]EnterpriseFrameWork框架系列文章索引> EFW框架源代码下载:http://pan.baidu.com/s/1qWJjo3U 单点登录(Single Sign ...

随机推荐

  1. 实现关闭窗口IE不提示兼容火狐

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  2. [VS2013]如何闪开安装VS2013必须要有安装IE10的限制

    来源:http://blog.163.com/qimo601@126/blog/static/1582209320143354446462/   已阻止安装程序,此版本的Visual Studio需要 ...

  3. php public protected private属性实例详解

    php 类中函数和类变量都有三个属性:public protected private,具体什么时候使用什么属性好纠结,特意找了个实例,这样看起来更清晰. public 表示全局,类内部外部子类都可以 ...

  4. js作用域和词法分析

    都知道js中不存在类似于c++等语言的块级作用域,例如for循环中定义的变量,其实是属于当前对象下的属性,同一对象下可以随便访问.只有函数可以限定一个变量的作用范围,即函数才是变量的作用域. 对于函数 ...

  5. 编程之美2014挑战赛 复赛 Codehunt平台试题答案

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  6. html写法对gzip压缩率的影响

    前几天在群里看到小杜分享一篇文章,<html写法对gzip压缩率的影响>,为此我也对这点分析了一下.不知道大家有没有看过这文章,作者是来自微博懒懒交流会,其内容我这里先简述一下. Gzip ...

  7. 初识ASP.NET 5中的Sake与KoreBuild

    从github上签出基于ASP.NET 5的MVC 6的源代码进行编译,发现有2个编译命令: build.cmd是针对Windows的编译命令,build.sh是针对Mac/Linux的编译命令,这本 ...

  8. Navicat for MySQL的服务器连接管理

    Navicat for MySQL可以导入导出数据库服务器的连接,方便你换机器时不用再设置连接.    导出为一个.ncx的XML文件. 导入后,在执行一个查询时,可能会报以下错误 这是因为源机器和本 ...

  9. [安卓] 6、列表之ArrayAdapter适配

    这个和以前的几个都有点不同,首先这个不用在xml中写对应的控件,而是直接在activity中将整个list实现的:首先要实例化列表和用于存储数据的数组list[9-10],第12-14行放list里加 ...

  10. [ACM_数据结构] 竞赛排名

    比赛排名 Time Limit:1000MS  Memory Limit:32768K Description: 欢迎参加浙江工业大学“亚信联创杯”程序设计大赛,本次竞赛采用与 ACM/ICPC 相同 ...