ASP.NET2.0

网站开发

分析单点登录(流程图与数据安全)

     原文:[原创]单点登陆(SSO)组件的设计与实现一 
    最新修改:SSO子站点间状态管理问题.08-6-12 
    最新修改:完善SSO安全问题.08-6-11 
    
     去年公司也曾经做过一个单点登录模块,两个站点,同事是基于cookie和session来实现的,在那个模块中并没有单独的用户认证中心,每个子站都有自己的登录系统,在判断用户是否登录时,首先是通过判断cookie是否存在来判断用户登录与否.如果cookie值存在则写入session,保存登录票据.

     一般基于cookie的程序,在某种程度上来说最大的问题就是安全,因为它是以文件形式存储在客户端的.所以一般非常重要的信息,例如用户登录信息,用户银行卡信息都不会采用cookie来存储.尽管cookie可以加密,但个人总觉的不放心.为此本人一直在寻找一种安全级别高点的单点登录方案.

     前不久,本人看到了这篇文章::[原创]单点登陆(SSO)组件的设计与实现一 ,发现它是基于session的,当时特别奇怪,因为平时我们知道session是不能跨应用程序的,后来仔细分析下才知道原理:

     按照程序的思想,我改下了实现的流程图,个人好理解些:

    
      
       如果原博主看到了这张图,还望评价下是否符合原文思想呢?本人对这方面的经验还不是特别多,只能理解到此啦,望大家指教.

       本人除了更改单点登录的流程图外还想探讨下基于cookie以及基于session两种方式实现的区别及好处:

       在上面的解决方案中,联盟站点想要实现单点登录,就一定要与认证中心交互,这样就要在WEB中传递用户登录信息,一般都包括用户名和用户登录密码.这是我们最关心的问题,因为密码这种非常重要的信息在WEB中传递也是相当
危险的,主要是有非法用户去截获传递信息来篡改用户信息。
     
      上面的解决方案原博主实现的非常好,这里我就引用下原文吧:
     

11 本系统的安全性

11.1 登录请求的格式

联盟站点向认证中心发送的登录请求格式如下:

站点信息+登录请求编号+时间戳+空用户信息+对站点信息和登录清秋号的签名信息。
除了签名信息之外的全部信息均为明文传送,但因为重要的数据均经过数字签名,结果是站点信息和登录请求编号是不能被篡改的,保证了认证中心收到的登录请求的真实性。

11.2 登录答复的格式

认证中心发给联盟站点的登录答复格式如下

登录用户信息+登录请求编号+时间戳+对用户信息和登录请求号和时间戳的签名信息
其中登录用户信息是经过非对称加密的。请求号和时间戳因为经过签名,故也不能篡改,这样就可以保证联盟站点收到的登录答复的真实性和完整性。并且非正常联盟站点无法解密用户信息,也无法从中获取好处。  

     这里的数字签名是采用了RSA数字签名算法加密的。
   
Code
    
       这种方式并不能防止非法用户去截获认证中心的答复信息,如果非法用法提前截获认证中心的答复信息,则他可以利用截获的答复信息用于登录,但是不能篡改信息,因为经过RSA数字签名。这个缺点也是这个方案安全上唯一的。基于cookie也同样存在这样的安全问题。基于cookie的方式将更多的处理交给客户端处理可以减轻服务器压力,这点要好于基于session方式。
 
      非常谢谢名们园友们这么费劲的看我的分析文章,大多朋友都提出安全问题,如上.@ Microshaoft,非常谢谢这位朋友的指点,他的想法和我后来的想法差不多.

      我的思路:子站用户在向认证中心发出登录请求时,附加上一个随机数或者是用户IP,附加信息都要经过加密及签名.然后认证中心返回答复信息,经过较验,如果附加信息相符则说明是合法用户.

      .@ Microshaoft的思路:

      认证中心颁发加密(对称、非对称、先用非对称加密交换对称密钥)的临时Token串,重定向的方式可以发给其他域名的站点
其他域名的站点解密(验签)Token,自己维持状态(cookie session url等)
 
     如果把这两种方法结合起来(附加信息返回时经过特殊加密,再返回解密密钥) ,客户端根据临时Token串解密附加信息,然后再验证附加信息,这样做应该就不会有安全问题了.
     

      在学习基于session的SSO时,不明白的地方就是如何处理用户退出。
      例:如果在A站登录,同时在B,C 等站都成功登录了。此时各站都写入SESSION,一般session是有失效时间的,当A站的SESSION失效时,对其它站的登录状态是否有影响呢?当用户不调用退出而是直接关闭网页时,如何处理用户的登录状态?目前本人并没有寻找到合适的解决方案,期待中。。。

     由于上面的问题说的不太清楚,针对性不强,为此换成如下的说法:希望不会再引起看不懂的问题.

     如果在A站登录,同时在B,C 等站都成功登录了。此时各站都写入SESSION,一般session是有失效时间的,当A站的SESSION失效时,此时B和C站的SESSION没有过期,按道理说此时A站是退出状态,但此时访问B站,由于B站的SESSION没有过期,B站的用户应该是登录状态,这样是不是不统一啊.应该是要么都是登录状态要么都是退出状态吧. 
      

      本人正在寻求优越的SSO解决方案,如果园友们有什么好的方案不妨共享学习下。:)

posted on 2008-06-11 02:35 姜敏 阅读(3468) 评论(38)  编辑 收藏 所属分类: ASP.NET2.0

Feedback

#1楼  2008-06-11 03:56 大石头      

又来单点登录,大体看一看,没有涉及最难的那个点,没意思!!

居然连基本的加密问题都还没有解决。

数字签名算法是用于签名的,用于加密的是非对称加密算法。

园子里面已经有很多SSO的案例了,建议多看看^_^   回复  引用  查看    

#2楼  2008-06-11 07:50 丁学      

很容易被冒充,一旦我知道了某个用户的UID,那么我就总可以在他登录到某个站时,通过直接输入URL进入到这些站中
-----------------------
你那个图是这个意思,文章没细看,应该会避免这个情况   回复  引用  查看    

#3楼  2008-06-11 08:13 Dove.Net      

还是没有新鲜的东西   回复  引用  查看    

#4楼  2008-06-11 08:29 一味      

基于Cookie和基于Session的区别不大。

基于Session的时候,非法用户截获了Cookie里的SeesionID,同样可以冒充登录用户。   回复  引用  查看    

#5楼  2008-06-11 08:47 王孟军!      

SSO分几种情况
同一主域的SSO
非同一主域的SSO
第一种,实现比较简单,
第二种,我还没用过   回复  引用  查看    

#6楼 [楼主] 2008-06-11 09:04 姜敏      

@大石头
大体看一看,没有涉及最难的那个点,没意思!!

居然连基本的加密问题都还没有解决。

数字签名算法是用于签名的,用于加密的是非对称加密算法。

谢谢指教
本人学的不是太好,是否能够有详细点的指教呢,或者说给个案例什么的也好啊.   回复  引用  查看    

#7楼 [楼主] 2008-06-11 09:04 姜敏      

@丁学
经过数字签名的密码应该问题不大吧.   回复  引用  查看    

#8楼 [楼主] 2008-06-11 09:06 姜敏      

@Dove.Net
本人也只限于实验,并无太多实践经验,不太清楚什么是新鲜的,能解决问题的方案应该就行.:)   回复  引用  查看    

#9楼  2008-06-11 09:06 jillzhang      

@丁学
-------------------------
我那个方案应该的问题在于没有使用客户端证书,其他的诸如被篡改,伪造,截获都不是问题。
uid知道也无所谓,1。它传递的时候是要经过加密的 2。传递过程中这个uid是被签名中的一部分。
只要联盟站点能解析出来并验证签名通过,就证明是联盟站点发出的,任何人都伪造不了   回复  引用  查看    

#10楼 [楼主] 2008-06-11 09:07 姜敏      

@大石头
居然连基本的加密问题都还没有解决。

数字签名算法是用于签名的,用于加密的是非对称加密算法。

希望得到指教,如何解决.
  回复  引用  查看    

#11楼  2008-06-11 09:08 jillzhang      

@姜敏
----------------------------
数字签名不是加密,数字签名的目的就是防止篡改
我那个方案中,我基于的是uid的公开的信息,但如果涉及到密码等秘密的时候,除了数字签名,加密也是必不可少的。   回复  引用  查看    

#12楼 [楼主] 2008-06-11 09:09 姜敏      

@jillzhang
还是队长说的对啊,本人差点搞坏张老师的名声啊,不知道张老师对小弟的这个自己理解的流程图是否同意呢,哈哈.   回复  引用  查看    

#13楼  2008-06-11 09:10 PerfectDesign      

可以学习一下 ws-Federation规范,这个能很好的实现单点登录,并且比传统单点登录更有优势。   回复  引用  查看    

#14楼 [楼主] 2008-06-11 09:12 姜敏      

@jillzhang
队长好, 我的问题是:如果非法用户截获了认证中心的答复信息,那他就可能用来登录,这种情况如何来防止呢?   回复  引用  查看    

#15楼  2008-06-11 09:13 PerfectDesign      

@jillzhang
数字签名本身就是加密技术,但是他的目的是防止篡改。
公钥的加密就是签名。
  回复  引用  查看    

#16楼 [楼主] 2008-06-11 09:13 姜敏      

@PerfectDesign
ws-Federation规范
对这个还不太了解,谢谢指点,下次看看.   回复  引用  查看    

#17楼  2008-06-11 09:14 jillzhang      

那个方案有漏洞,那就是没有客户端证书,但加上SSL之后,基本上也能满足非常高的安全要求,因为它还有过期和登陆请求验证。
任何加解密都是可破解的,包括数字签名,非对称性加密,都能破解,只是所需要花费的时间不同,数字签名算法都是基于古典数学难题,基本上从古至今无人能解,用大型计算机也要计算上千年上万年方能解开,这就和无解一样了。加上时间戳机制,基本上被破解的几率还是比较小的   回复  引用  查看    

#18楼 [楼主] 2008-06-11 09:15 姜敏      

本人近期在分析SSO,本文是分析园友的文章,说的不太好,忘大家见谅.:)   回复  引用  查看    

#19楼  2008-06-11 09:15 jillzhang      

@PerfectDesign
数字签名本身就是加密技术,但是他的目的是防止篡改。
------------------------------------------
数字签名不是加密!
签名是签名,加密是加密,怎么能混为一谈。   回复  引用  查看    

#20楼 [楼主] 2008-06-11 09:17 姜敏      

@jillzhang
哈哈,谢谢队长的帮忙,我会好好整理下,我想做成一个成型的可用的模块出来.之前对这方面了解和理解都是有限的,所有说的太差,以后会努力改正的,忘各们大虾们不要见怪啊.   回复  引用  查看    

#21楼  2008-06-11 09:22 lovecherry      

http://www.cnblogs.com/lovecherry/archive/2006/10/11/526151.html   回复  引用  查看    

#22楼  2008-06-11 09:49 簡簡單單..      

Mark   回复  引用  查看    

#23楼  2008-06-11 10:06 Microshaoft      

认证中心颁发加密(对称、非对称、先用非对称加密交换对称密钥)的临时Token串,重定向的方式可以发给其他域名的站点
其他域名的站点解密(验签)Token,自己维持状态(cookie session url等)   回复  引用  查看    

#24楼  2008-06-11 10:22 PerfectDesign      

@jillzhang
偶的意思是签名用到的是加密技术
签名就是hash后成为一小段然后你再使用你的私钥加密,那么对方在只有使用你的公钥解密出来的情况下,就能验证这个东西是不是你发给我的啊~~

加密是技术,签名是目的   回复  引用  查看    

#25楼  2008-06-11 10:46 坏人      

SESSION的加入在SSO一般用来提高性能,减少不必要的每次检测用户登录状态用。   回复  引用  查看    

#26楼  2008-06-11 10:47 坏人      

但SESSION本身会次优先于COOKIE和URL,由此来解决退出问题。   回复  引用  查看    

#27楼  2008-06-11 11:18 王孟军!      

姜敏

建议你 直接请教DUDU
因为BLOGS就是SSO模式   回复  引用  查看    

#28楼 [楼主] 2008-06-11 11:48 姜敏      

@王孟军!
有道理,不过本人小兵,他太忙.   回复  引用  查看    

#29楼 [楼主] 2008-06-11 11:51 姜敏      

@Microshaoft
认证中心颁发加密(对称、非对称、先用非对称加密交换对称密钥)的临时Token串,重定向的方式可以发给其他域名的站点
其他域名的站点解密(验签)Token,自己维持状态(cookie session url等)

这个想法不错,我之前是这样想的,子站用户在登录时,将一随机数或者IP加密签名发送给认证中心,然后子站点用户接收到认证中心的登录答复信息后进行信息较验,相同则认为是合法用户.   回复  引用  查看    

#30楼  2008-06-11 13:19 jillzhang      

例:如果在A站登录,同时在B,C 等站都成功登录了。此时各站都写入SESSION,一般session是有失效时间的,当A站的SESSION失效时,对其它站的登录状态是否有影响呢?当用户不调用退出而是直接关闭网页时,如何处理用户的登录状态?目前本人并没有寻找到合适的解决方案,期待中。。。
---------------------------------------------------------------
登出的问题我在解决方案中也有说明,无论cookie还是session,首先要确定一个既定事实,那就是登出操作必须由客户端浏览器发出,因此我的思路是在认证中心注册联盟站点时候提供联盟站点的登出页地址,而在联盟站点中记录有认证中心登出地址,如果是SSO用户,登出的时候,都要到认证中心登出页,在此页面中,循环当前用户已经登过的站点列表,通过向页面中写<irame的方式,逐个访问联盟站点的登出地址,逐个登出   回复  引用  查看    

#31楼  2008-06-11 13:53 迅捷数据中心 [未注册用户]

迅捷数据中心(www.cnidc.hk)香港机房特推出优惠:

1、1U托管月付800,一次性付9个月费用,即送十二个月托管
2.1M国际带宽租用 1500/月,一次性付10个月费用,即送十二个月使用

租用机器优惠,点击www.cnidc.hk
QQ:598605810
迅捷数据中心   回复  引用    

#32楼  2008-06-11 15:03 丁学      

@jillzhang
楼主那个图里没有关于加密一说,也没有提到签名   回复  引用  查看    

#33楼  2008-06-11 17:52 Leem      

使用session的话,就需要保证认证中心的session长期有效,否则会存在过期问题.

在用户之前截获票据的这种可能性是非常小的,可以说几乎不存在.用户一旦认证成功,就将票据标记为使用过或者删除,就不存在安全问题了.   回复  引用  查看    

#34楼  2008-06-11 18:17 charleschen      

耶鲁的cas不错的   回复  引用  查看    

#35楼  2008-06-11 21:35 Old man [未注册用户]

这里有一篇Bz可以看看
http://www.cnblogs.com/Alexander-Lee/archive/2007/09/29/910373.html   回复  引用    

#36楼 [楼主] 2008-06-11 23:55 姜敏      

@jillzhang
队长可能没有太清楚我说的问题.

例:如果在A站登录,同时在B,C 等站都成功登录了。此时各站都写入SESSION,一般session是有失效时间的,当A站的SESSION失效时,对其它站的登录状态是否有影响呢?当用户不调用退出而是直接关闭网页时,如何处理用户的登录状态?目前本人并没有寻找到合适的解决方案,期待中。。。

我是说:如果在A站登录,同时在B,C 等站都成功登录了。此时各站都写入SESSION,一般session是有失效时间的,当A站的SESSION失效时,些时B和C站的SESSION没有过期,按道理说此时A站是退出状态,但此时访问B站,由于B站的SESSION没有过期,B站的用户应该是登录状态,这样是不是不统一啊.应该是要么都是登录状态要么都是退出状态吧.
  回复  引用  查看    

#37楼 [楼主] 2008-06-11 23:57 姜敏      

@Leem
使用session的话,就需要保证认证中心的session长期有效,否则会存在过期问题.

认证中心并没有SESSION,是用一个静态的hashtable来保存登录用户列表的,并不存在SESSION过期的问题,这里应用了单例模式.
  回复  引用  查看    

#38楼 [楼主] 2008-06-11 23:57 姜敏      

@Old man
谢谢,我会好好看的.   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-06-12 00:39 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: