`
crazysoul
  • 浏览: 3637 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

对单点认证的理解(不是讨论怎么解决)

阅读更多
好比你去一个公园游玩,去到每个摊点时却又要你买一次票,是不是很麻烦?
而单点认证就是只要在门口买一次票后,只需在进去时要向摊主展示一下你的门票
,同一个公园内的摊点就任意随你参观了。

即统一一个登录入口,经过验证后发给客户端一张"门票"作为买过票的评据,可以访问所有"公园设施",至于"门票"是怎么保存到游人手上(客户端)的,就是单点认证的核心难点。

很多人说用COOKIE。不错,在B/S模式中,COOKIE可以说是唯一合法的、能主动由服务器存放数据到客户端的途径(SESSION也是由COOKIE来保存SESSIONID的,若是临时的则由当前浏览器进程,SESSION和COOKIE的关系已在另一篇文章里讨论过了)。
但COOKIE有个限制,就是"跨域"问题,即一个站点只能控制以它的根域为名的COOKIE数据,如WWW.W3C.COM则只能控制W3C.COM这个域的COOKIE,其他如GOOGLE.COM、microsoft.com等的它都管不了。

当架设一个单点认证系统时,用户访问应用服务器A(AS.A),AS.A在自己的服务器上找不到有登记信息,则会导向到登录服务器(LS)为用户做登录认证,通过认证后,LS记录下用户的信息,并给AS.A发一个信息说"这个用户买票了",AS.A就在自己的服务器上接收LS传过来的复本作登记了(则以后不用每次都向LS查询),同时回馈给用户一张"票根"即认证根据(TOKEN ID),再把用户导向回AS.A,用户就可以到AS.A上进行他的活动了。

过了会用户在AS.A上玩厌了,想到隔壁的AS.B上看看时,AS.B也要问用户查看他的"票根",这时问题来了。

如果AS.A和AS.B是不同域的,一个是A.COM一个是B.COM,用户(USER)要访问AS.A则只要判断COOKIE里有没"票根"并根据这个"票根"来核对是不是他本人。
这个"票根"对AS.B也是通用的,只要向AS.B展示这个"票根"就行了。但问题正是,"票根"是在通过LS认证后,AS.A存放到A.COM的COOKIE里,而在访问AS.B时,AS.B是不能访问A.COM的COOKIE数据的,或者说它根本不知道A.COM的存在。
(注:A1.A.COM和A2.A.COM这样是同域的,都可以访问A.COM的COOKIE)

所以USER在访问AS.B时又要得到LS做一次认证,这就违反了单点认证的本意。
这就是COOKIE的跨域限制问题。



一个简陋的解决方案是在AS.A的每个连接上都追加一个TOKEN ID(类似&TOKENID=asrw34rzx242),当用户顺着这个连接到AS.B时,AS.B就能根据这个贴在用户脑袋后面的"票根"来向LS做认证查询了,若在LS上有对应TOKEN ID的合法信息存在,则也保留一份到自己的服务器上备用,并且也有样学样在每个连接上贴上这个"票根",好让用户顺着连接到别的"摊点"(AS.C、AS.D.....)上继续游玩。

但这种这方法实现很简单,但有很多缺点,如要求所有认证系统内的页面都要贴上一段TOKEN ID,即不美观又麻烦,而且,当用户不是顺着页面的连接,而是新开一个窗口来访问AS.B时,取不到TOKEN ID的值,也需要重新到LS认证一次。
所以这种做法只适合简单的会话型或一条龙服务型的。

还有一种做法是LS群发,即用户登录后,LS向所有在它名下所有登记的"摊点"都发一次通知,让他们自己做记录。如果用户无聊登录一下又马上退出又登录...,那LS就可能忙得不可开交了,接到通知的AS们也要跟着瞎闹个不停;又假设同时有100人登录,而园内有上100个摊点,LS就要发通知100X100次,真是一百遍又一百变;很有可能一个用户永远只去一个"摊点",其他的一次都没有去过,而其他的也要为他做登记,已供侯用户的"突击访问",这样就比较浪费资源和表情了。
所以这种做法也不是很妥当,适合园子比较小的:)
(后来认真想想也不行,就算每台服务器里都有登录信息了,但用户手上还是没有证明他身份的凭据:TOKEN ID,因此此方案否决!)

一种比较可行的方案:
借用这里了一个很巧妙的思路(纯指思路,代码不成熟)
http://blog.csdn.net/liyujie2000/archive/2004/03/11/13511.aspx?Pending=true

即在访问AS.B时,AS.B得不到TOKEN ID则不是主动向LS查询了,而是"悄悄"地引导客户到LS,再"悄悄地"由LS把客户的TOKEN ID帖到客户的脑后带回到AS.B,AS.B就可以根据根据带回来的TOKEN ID再向LS做一次验证(如此麻烦是为了防止欺骗,当然LS和AS.B之间的会话也要校验),这个过程是"瞒着"客户利用客户的浏览器(就是为了取回LS的COOKIE"票根")悄悄进行的,用户体验上最多在第一次访问时比第一次登录AS.A时慢一点,因为多了一步AS.B向LS校验的过程,但总的来说是简单可行的。
(注1:因为每次合法认证都需经过LS,所以LS的COOKIE是一定存在的,若不存在呢?废话,提示他登录咯。所以LS的COOKIE是这个跨域方案的基础)


能不能不用COOKIE呢?
这跟客户端的身份识别技术有很大关联,如果能确认唯一客户端,那就可以不依靠COOKIE了,这种技术也有不少,但都不是很方便,如客户证书等。另外有人说取用户的网卡的MAC值,如果你能用"合法"的手段做到,那么我也没意见的。


还有COOKIE的一个"伪造"和"顶替"问题(COOKIES欺骗),所谓"伪造"那是知道服务器生成COOKIE的格式和算法,伪造者再重新生成的一个COOKIE,如SERVER A的COOKIE的结构为:USERID = XXX;USERPASD = ****;TOKEN=ASD34AF23SDF3;
TOKEN是根据USERID和USERPASD再加上服务器的私钥生成的一段摘要,
而伪造者只有知道它的私钥和TOKEN的具体算法才能用任意的USERID和USERPASD来伪造一个合法的COOKIE。
而顶替呢,则只需要得到这段"USERID = XXX;USERPASD = ****;TOKEN=ASD34AF23SDF3;"完整的数据,根本不需要知道服务器的私钥和TOKEN的算法,只需把这段COOKIE发给服务器,在SESSION ID的有效期内就能冒充这个COOKIE本身的所有者来与服务器进行会话。
有些人对这两个概念老是混淆不清就一昧地说COOKIE不安全、容易被窃取,那只是看到"顶替"这一方面,但若要随意伪造COOKIE却不会那么容易,如果你能随意得到服务器的私钥(就算TOKEN的算法是公开的),那只能说是那台服务器的管理有问题,你把银行帐号的密码写到本子上锁到柜子里,而柜子被小偷撬开,根据密码到柜员机取走了钱,难道可以说是银行不安全吗?


相关讨论连接(有些思路不是完全正确的,不要随便盲从):
http://forum.iteye.com/viewtopic.php?t=11655&highlight=%BF%E7%D3%F2
http://forum.iteye.com/viewtopic.php?t=11582&highlight=%BF%E7%D3%F2
http://forum.iteye.com/viewtopic.php?t=6473&highlight=%BF%E7%D3%F2
分享到:
评论

相关推荐

    SSO单点登录解决方案

    在"百度_身份认证吧_谈谈应用整合中的单点登录(SSO)系统"讨论中,可能会涉及到实际应用中遇到的问题和解决策略,例如跨域认证、安全策略的设置、多环境下的部署方案等。文件夹".files"通常存储了这些网页的附件,...

    JEECG 单点登录集成文档(kisso集成)

    JEECG单点登录集成文档(kisso集成)详细介绍了如何将Kisso单点登录解决方案集成到JEECG智能开发平台v3版本中。文档中提到了Kisso的基本概念和实现单点登录(SSO)的技术细节,具体包括服务端和客户端的集成步骤以及...

    构建和实现单点登录解决方案(CAS)

    在本主题中,我们将深入探讨如何构建和实现基于CAS(Central Authentication Service)的单点登录解决方案。 CAS是一个开源的SSO框架,它提供了安全的身份验证服务,使得用户只需一次登录即可访问多个应用。其核心...

    单点登录文档

    ### 单点登录技术实现与CAS认证系统 #### 一、单点登录(Single Sign-On, SSO)概念 ...通过对该项目的深入分析和技术实现细节的探讨,我们可以更好地理解单点登录技术的应用价值和其实现过程中的关键点。

    php实现单点登录实例

    在IT行业中,单点登录(Single Sign-On,简称SSO)是一种身份验证机制,它允许用户在一个系统上登录后,无需再次输入凭证就能访问多个相互信任的系统。这对于大型网络环境或拥有多个子系统的公司来说尤其有用,可以...

    CAS单点登录之测试应用

    标题中的"CAS单点登录"是指Central Authentication Service(中央认证服务),它是一种广泛使用的开源单点登录(Single Sign-On, SSO)系统。SSO允许用户通过一次登录就能访问多个应用系统,而无需反复输入用户名和...

    基于SAML的单点登录系统的研究与实现

    通过SAML,可以在不同系统间共享用户身份认证和授权数据,从而实现单点登录和单点登出功能。SAML是实现SSO的重要标准之一,广泛应用于企业级的SSO解决方案中。 研究与实现基于SAML的单点登录系统通常包括以下几个...

    Iframe+Cookie实现简单的单点登录

    【标题】:“Iframe+Cookie实现简单的单点登录” 单点登录(Single Sign-On,SSO)是一种身份验证机制,允许用户在多个相互关联的应用系统中登录一次,然后在整个会话期间无需再次输入凭证即可访问这些系统。在本文...

    定制cas单点登录用户名密码验证

    这些文件名暗示了学习资源的内容,包括Yale大学的CAS教程、关于CAS的Java开发者论坛讨论、一篇关于CAS最佳实践的文章以及一篇关于在Tomcat上开发CAS单点登录并定制认证方式的博客文章。这些资料将提供详细的步骤、...

    单点登陆代码仅供参考

    单点登录(Single Sign-On,简称SSO)是一种身份验证机制,它允许用户在一个系统或应用中登录后,无需再次认证就能访问多个相互关联的系统或应用。在现代企业环境中,用户经常需要处理多个系统,如邮件、CRM、ERP等...

    基于FIDO技术的物联网身份认证解决方案.pdf

    同时,由于FIDO认证不依赖于中央认证服务器,减少了单点故障的风险,增强了系统的整体安全性。 文章可能涵盖了以下几个方面: 1. **FIDO技术详解**:介绍FIDO的原理,包括公私钥对的生成、非对称加密以及与服务器...

    .net版本单点登录与权限管理(web api)

    总结,.NET版本的单点登录与权限管理在Web API中的实现涉及到多个层面,包括认证协议的选择、授权策略的设计以及安全性考虑。通过理解这些概念和实践,开发者可以构建出安全、高效的Web API服务。在实际项目中,可以...

    单点登录Java代码

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个系统上登录后,无需再次输入凭证即可访问多个相互信任的系统。在Java开发中,实现SSO可以帮助提高用户体验,减少密码管理的复杂性。下面...

    cas.rar_67194com_67194。com_CAS_cas单点demo_shiro 单点登录

    接下来,我们将详细讨论这些技术以及它们在单点登录场景中的应用。 首先,CAS是一种基于票证(Ticket)的身份验证协议,它允许用户通过一次认证过程访问多个服务,而无需多次登录。当用户首次访问受保护的资源时,...

    分布式架构单点登录+授权认证实战 CAS+SpringSecurity视频

    分布式架构中的单点登录(Single Sign-On, SSO)与授权认证是现代企业级应用系统设计的关键组成部分。SSO允许用户在多个应用系统中只需登录一次,就能访问所有相互信任的应用,大大提升了用户体验。本实战课程围绕...

    cas单点登录客户端--c++版

    CAS(Central Authentication Service)是中央认证服务的缩写,它是一种广泛使用的单点登录(Single Sign-On, SSO)框架,主要用于实现用户在一个系统登录后,可以无须再次验证即可访问其他相互信任的系统。...

    java单点登录sso源码

    Java单点登录(Single Sign-On,SSO)是一种网络访问控制机制,允许用户在一次登录后,无需再次认证即可访问多个应用系统。SSO的核心思想是:用户只需要在一个可信的身份认证中心(Identity Provider,IdP)进行身份...

    cas单点登录4.0

    在你提供的资源中,"cas单点登录4.0"包含了CAS服务器的WAR包和4.0版本的源代码,这对于理解CAS的工作原理,以及自定义和扩展CAS功能来说非常有价值。 1. **CAS 4.0 概述** CAS 4.0是CAS项目的一个重要版本,它带来...

Global site tag (gtag.js) - Google Analytics