Web环境下单点登录服务的设计与实现

shenlijun88

贡献于2012-06-19

字数:0 关键词: OpenID/单点登录SSO

2007.8 69 应 用 安 全 Web 环境下单点登录服务 的设计与实现 孙涛 余晓佳 南方医科大学网络中心 广东 510515 摘要:本文介绍了单点登录服务在目前Web应用开发中的意义,通过对单点登录服务实现的结构和原理进行分析,提出 了一种 Web 环境下实现单点登录服务的思路和方法。 关键词:SSO;认证票据;Cookie;域;Web 服务 0 引言 单点登录(Single Sign On),简称SSO,可简单的概括为在 多个分散、相互信任的应用系统之间,用户只需在其中任何 一个应用系统上执行一次登录操作就可自由访问所有相互信 任的其他系统。SSO 服务的目的就是为了解决企业或单位内 部多系统重复身份验证的问题,通过在企业或单位内部应用 中实现基于 Web 的 SSO 服务,可将分散的 Web 应用系统进行 整合,实现一次登录即可在多个应用之间随意跳转,无须重 复登录。 1 原理分析 实现 SSO 服务,主要需要实现以下两个关键部分: (1)所有应用系统共享一个用户认证系统 首先需要构建一个统一的“认证中心”,针对各应用系统 的登录请求首先被传送到“认证中心”进行登录,登录成功 后“认证中心”将一个代表用户身份的认证票据(Ticket)返 回给各个应用系统。 (2)所有应用系统能够提取和识别“认证中心”返回的 ticket信息。 各应用系统无论基于何种系统平台或开发语言,都应能 提取识别“认证中心”返回的Ticket并进行有效性验证,从 而可以判断出该用户是否已经登录。 2 系统实现 2.1 设计思路 在 Web 环境下,SSO 服务中的“认证中心”可以一个网 站的形式实现,我们可以利用 ASP.NET、JSP 等 Web 开发技 术,同用户数据库进行整合,实现一个标准的三层结构的Web 应用程序来完成“认证中心”的功能,该网站向其他 Web 应 用程序提供统一的用户登录和注销退出页面,负责生成认证 票据(Ticket)并以Cookie的形式保存。其他Web应用程序通过 Web 重定向将登录请求发送到“认证中心”的用户登录页面 完成认证,认证成功后返回一个认证成功的标记给发起认证 请求的 Web 应用程序,后者接收到认证成功的标记后提取保 存在“认证中心”Cookie中的Ticket,并根据Ticket中的信息 完成自身的登录。当用户跳转到其他 Web 应用程序时,可通 过“认证中心”从Cookie中再次提取这个Ticket来进行身份 验证,判断用户是否曾成功登录过。 2.2 主要工作流程 SSO服务的工作流程主要就是生成认证票据(Ticket),然 后该票据在“认证中心”和其他 Web 应用程序之间来回传递 和验证的过程(如图1)。 图 1 Web 环境下 SSO 工作流程 用户访问网站 A,网站 A 检查自身的认证 Cookie判断该 用户是否已经登录: 情况一:该用户尚未在网站 A 登录 网站 A 显示“登录”按钮,用户单击“登录”按钮,网应 用 安 全 2007.870 站 A 重定向到“认证中心”, 并把自身的 URL 作为参数,以 get方式传送。 “认证中心”接收到网站A传来的请求,首先提取URL参 数,然后检查“认证中心”自身的Cookie判断用户是否已经 在“认证中心”登录,分为两种情况: (1)用户尚未登录:“认证中心”显示登录页面,根据用 户输入的用户名和密码到后台用户数据库中进行验证,验证 通过则将认证票据Ticket保存到 “认证中心”的自身Cookie, 标识该用户已经在“认证中心”登录,然后根据前面提取的 URL 参数将页面重定向回网站 A,并在 URL 中附加一个表示认 证成功的字符串。网站 A 接受到表示认证成功的字符串后,开 始读取“认证中心”的Cookie,从中提取认证票据Ticket进行有 效性验证,有效则设置自身的Cookie,标识用户在网站 A登录 成功,Ticket 验证无效则重新返回“认证中心”的登录页面。 (2)用户已经登录:用户可能通过其它的系统已经在“认 证中心”登录过了,“认证中心”的Cookie已经被设置。这时 则直接在 URL 中附加表示认证成功的字符串,然后重定向回 网站 A,网站 A 接受到表示认证成功的字符串后,提取保存 在“认证中心”Cookie中的Ticket进行有效性验证,有效设 置自身的 Cookie,标识用户在网站A 登录成功,否则重新返 回“认证中心”的登录页面。 情况二:用户已经在网站 A 登录 网站 A 显示“退出登录”按钮并继续提供服务。 当用户点击网站 A“退出登录”按钮时,网站 A 重定向 到“认证中心”的退出登录页面,“认证中心”通过设置自身 Cookie 过期来完成“认证中心”的退出登录,然后分别调用 SSO 服务内所有网站的退出登录页面,完成全部 SSO 服务内 的应用系统的同步退出。所有应用系统的退出登录页面只负 责设置本系统的认证Cookie过期即可。 从上面对工作流程的简要概括可以看出,“认证中心”的 基本功能实现就是:接受请求-〉访问用户数据库验证用户-〉 设置认证Cookie保存认证票据Ticket-〉返回认证结果给发起 请求的应用程序,客户端Web应用程序的基本功能实现就是: 转发登录请求-〉取得认证结果-〉读取“认证中心”的Cookie 并提取Ticket-〉验证有效性-〉设置自身Cookie实现登录。 2.3 登录票据Ticket的保存和读取 登录票据Ticket的保存和读取是SSO服务实现的核心和 关键,“认证中心”保存认证票据Ticket后,SSO服务内的所 有应用程序都需要读取这个Ticket来判断用户是否已经登录。 在我们的实现方案中采用Cookie作为保存认证票据Ticket的 载体,因为Cookie是浏览器和Web服务器之间用于保存用户 状态的标准协定,任何浏览器、任何Web开发技术都对Cookie 具备很好的支持,可以很好的满足 SSO服务跨软件平台的认 证需要。 从上面工作流程中可以看到,“认证中心”完成用户认证 后生成Ticket并把它保存在“认证中心”的Cookie中,发起 认证请求的Web应用程序通过读取这个Cookie来提取其中的 Ticket完成自身登录。在实际开发中,这个步骤的具体实现会 受到很多限制。因为根据Cookie的设计标准,一个Web应用 程序设置的Cookie在另一个Web应用程序中是不能直接读取 的,这是出于 Web 应用开发中安全性上的考虑。而在 SSO 服 务应用中,“认证中心”和发起认证请求的其他Web应用程序 就是两个各自独立的 Web 应用程序,它们可能运行在同一 Web 服务器的不同虚拟路径下,也可能运行在两个相互独立 的Web服务器上,因此如何解决这个Cookie的读取问题就成 为基于上面设计思路的 SSO 服务实现的关键。根据 SSO 服务 运行网络环境的不同,我们可以采取不同的方式来实现对这 个Cookie的读取。 2.3.1 单一域环境下Cookie的读取 根据Cookie的设计约定,Cookie具有一个叫做Domain的 属性,该属性用于定义可以读取该Cookie的域,通过在开发 中为 Cookie指定Domain 属性,就可以保证这个Cookie可以 被设定的 Domain 内的其他 Web 应用读取。根据 Cookie 的这 个特性,如果 SSO 服务运行在单一域环境下,我们可以通过 设置“认证中心”Cookie的Domain属性来实现同一域内其他 Web 应用对它的读取。 比如“认证中心”域名为authentication.abc.com,在设置 “认证中心”Cookie时只要指定这个Cookie的Domain为“abc. com”,则abc.com 域内的其他应用程序,比如bbs.abc.com,就 可以读取这个Cookie了。以.Net开发环境为例,代码如下: Public void setTicketCookie(string ticket) { HttpCookie myCookie=new HttpCookie ("SSOTicketCookie",ticket); myCookie.Expires = DateTime.Now.AddHours(2); myCookie.Domain = "abc.com";//设置Cookie的有效域为 abc.com myCookie.Path = "/";//设置Cookie的存放路径 Response.Cookies.Add(myCookie); } 在内部局域网环境下,如果所有纳入SSO服务的应用都 运行在 abc.com 这个域内,我们可以修改内部 DNS 服务器设 置,为所有SSO服务内的Web应用设置类似***.abc.com二级 域名,这样这些 Web 应用就可以读取到“认证中心”设置的 Cookie并提取其中的Ticket,从而实现对认证Cookie的跨应 用读取。 2.3.2 跨域环境下Cookie的读取 当 SSO 服务内的 Web 应用程序运行在多域环境下时,二 级域名的方式就无法使用了,因为“认证中心”运行在abc.com 这个域内,其他应用可能运行在def.com 域内,这时def.com2007.8 71 应 用 安 全 域内的应用都无法读取abc.com域内的Cookie。 图 2 跨域 Cookie 读取原理 从SSO的工作流程可以看出,“认证中心”完成认证后将 重定向回发起认证请求的 Web 页面,我们可以采用 URL 参数 的方式将Ticket附加在URL地址后面连同认证成功的标志一 起传回,发起申请的 Web 页面可以取得这个参数并利用。但 这种方式无疑是很不安全的,因为认证票据Ticket就跟随在 URL 地址后面,任何用户都可截取并复制这个参数,然后发 送给其他 Web 应用来通过认证。为避免上面的安全问题,在 实际开发中我们需要采取其他的方式来实现“认证中心” Cookie的跨域读取。 Web Service是目前已经被广泛应用的Web开发技术,它 基于标准的Web通信协议(http、soap)和数据交换格式(xml)实 现,我们可以在一台Web服务器上通过http或者soap协议远 程调用网络上其他服务器发布的Web Service,并取得xml格 式的返回结果。目前几乎所有的主流 Web 开发语言都对 Web Service提供了全面的支持,可见Web Service的特性可以很好 的完成 SSO 服务中需要的跨域、跨开发语言、跨运行平台读 取Cookie的需要。 以上面的工作流程为例,“认证中心”认证成功并设置 自身 Cookie 后,以 URL 参数的方式将表示认证成功的字 符串传送回网站 A,网站 A 接收到这个字符串后,远程调 用“认证中心”的Web Service,该Web Service负责取得 “认证中心”设置的认证Cookie并从中提取Ticket信息,然 后返回给网站 A,网站 A 根据 Web Service返回的结果来 完成自身登录。  2.4 用户的注销与退出 同 SSO 服务的登录要求相同,在 SSO 服务中应实现“单 点退出”的功能,即当用户在 SSO 服务内任意一个 Web 应用 程序中注销退出时,系统应自动实现其他所有 Web应用程序 的同步退出。 首先需要为 SSO 服务内的每个 Web 应用编写一个注销退 出页面,这个页面功能很简单,就是通过把该Web 应用标志 登录成功的Cookie设置为过期来实现用户在这个应用中身份 的注销。当用户点击 SSO 服务中任何一个 Web 应用的“注销 退出”按钮时,Web 应用直接把这个请求重定向到“认证中 心”的注销退出页面,“认证中心”的注销退出页面首先设置 “认证中心”的Cookie过期来实现“认证中心”的退出,然后 再分别调用其他 Web 应用的注销退出页面完成。 例如 SSO服务内有两个Web 应用,其注销退出页面分 别是http://bbs.abc.com/signout.asp和http://movie.abc. com/signout.php,“认证中心”只需要在自己的注销退出 页面中嵌入下面的 Html 代码就可分别调用这两个页面来 完成该用户在bbs.abc.com和movie.abc.com这两个Web应 用的同步退出: 2.5 SSO服务的部署 要在Intranet中部署上面的SSO服务,需要对计划使 用 SSO服务的原有Web应用程序进行修改,主要是修改原 有程序的登录页面和注销退出页面。纳入 SSO 服务的Web 应用程序的登录页面不再执行原来的身份验证功能,只负 责将登录请求转发给“认证中心”, 并对“认证中心”返回 的结果进行提取和验证,根据返回的信息来完成自身的系 统登录和用户信息设置。注销退出页面则只需要完成自身 的退出即可,其他工作则由“认证中心”的注销退出页面 来实现。 如果 SSO 服务运行在跨域的环境下,还需要在“认证中 心”服务器上实现一个负责读取认证Cookie并返回其中Ticket 的Web service,其他Web应用程序则在自己的登录页面中实 现对这个Web Service的调用,来实现Ticket在各个系统之间 的传递。 3 总结 随着基于 Web 的各种业务应用的不断增长,SSO 服务已 经开始在 Web 应用中承担着越来越重要的角色,通过部署 SSO 服务,可以在内部统一各种应用的用户认证接口,实现 单一身份的网络漫游,从而大大提高了用户访问使用各种 Web应用时的效率。本文给出了一种Web应用环境下实现SSO 服务的基本思路和方法,这种方法可以将不同运行平台、不 同开发语言的 Web 应用进行集成,实现单点登录的功能。 参考文献 [1]Russ Basiura,Professional ASP.NET Web Services[M].Wrox Press Inc.2002. [2]Bilal Siddiqui, Enable Single Sign-on in ASP.NET with Passport. http://www.devx.com/security/Article/17742/0/page/1.2003. [3]Kyle.Gabhart.Cross-Domain Single Sign-On Authentication with JAAS. http://www.devx.com/security/Article/28849/0.2005.

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档