在特定情况下的简单SSO实现方案
最近需要实现类似单点登录的功能。情况是这样的,最初在做网站A,做着做着,要做网站B了,要求与网站A完全分开作为两个应用,但用户数据要求与网站A保持一致,也要求用户在网站A登录后,转到网站B时不需要再登录。怎么样,标准的SSO吧。
查了一些资料,了解了不少原理。园子里的几个兄弟也写得很多了,比如:jillzhang 的 单点登陆(SSO)组件的设计与实现一 和亚历山大同志 的 手把手教你可复用SSO组件的设计(原理篇) ,看了之后,受益匪浅,对实现原理有了基本了解。但各种实现方案都相对复杂,也没找到成熟的组件化实现方案。我所碰到的问题看起来并不是那么的复杂,实在是不想深入钻研(懒人,呵呵),苦思半响不解,实然灵光一现,顿悟,于是有了以下方案,大家来探讨巧一下,拍拍砖头。
环境说明:
在同一台物理服务器上,运行iis和sql server。在iis上有网站A和网站B,在Sql Server上有数据库A(sitea_db),数据库B(siteb_db)和用户数据库(user_db)。这下知道标题中的特定的意思了吧,是够特定了吧。
方案说明:
网站A和网站B的用户数据都统一放在user_db中,验证逻辑可以独立,也可以集中,这无所谓了。其他的没有任何改变,只有当用户从网站A跳转到网站B时,SSO隆重登场,整个流程如下:
1. 网站A生成一个随机的唯一的票据,比如GUID就很不错,将当前用户和票据存到user_db中,然后redirect到网站B,并把票据作为参数。
2. 网站B接收到票据,到user_db中找到相关票据对应的用户并设为当前登录用户,并立即在user_db中删除该票据记录。
OK,大功告成,够简单吧!!
在安全性上我不是专家,我想到可能的问题是该票据要是被截获,就会导致安全问题了,看了别的文章,标准的SSO方案好象也有类似的问题。我的解决方案也类似,将该票据的有效时间设置得小一些,在我所描述的情况下,我想可以设置为2秒甚至更小一些。
以上方案只是初步设想,与大家分享,欢迎批评指正。