关于Single Sign On的一些设想

单点登陆,始终有其吸引力。然而就实现而言,结合栋力无限现有情况,比较困难。

主要原因在于栋力无限门户下属各个子站点,不仅有自己开发的,也有直接使用的他人开发的开源项目的。特别对于后者,如果花大力气,对其进行修改,使其使用我们自身的passport,一旦其有所升级、打patch等变动,就会导致大量的重复劳动。

在现有条件下,是否存在一种花费最小代价的Single Sign On实现方式?换句话说,使得插接到passport的各个子站点,所作的修改尽量的少?

最近有一个设想,就是如果想要尽可能少的修改各个子站点,实现passport的通用性,唯有通过模拟各个子站点自身的登陆行为。

法1、填写username password,并post到其form的action链接里面;
法2、直接在用户本机写入cookie文件;

两种方式其实都可以。具体一点说:

第一阶段试验目标:

1、登陆passport.dormforce.net后,passport修改用户登陆状态信息为已登录(并以Web Services或其他方式对外公开)。

2、passport调用放在各个子站点自身程序里的一个模板页面,那个页面实现的唯一功能就是采用法1或法2模拟登陆本子站点,若有必要,在这里,还可以增加对Session,Application等变量的支持;(由于开源,可以跟踪入内,找到其登陆代码,copy过来修改一下即可)(调用的时候,最好使用AJAX等技术后台加载,防止页面频繁刷新,提高用户体验)

3、passport调用放在各个子站点自身程序里的一个模板页面,那个页面实现的唯一功能就是采用法1或法2登出本子站点,若有必要,在这里,还可以增加对Session,Application等变量的支持;(由于开源,可以跟踪入内,找到其登出代码,copy过来修改一下即可)(调用的时候,最好使用AJAX等技术后台加载,防止页面频繁刷新,提高用户体验)

至此,应该能够实现在passport登陆后,畅通访问各个子站点;在passport登出后,退出所有子站点;

第二阶段试验目标:

1、通过用户登陆状态信息等其他验证安全的手段,确保放在各个自站点的模拟登陆页面安全。

2、修改各个子站点的登陆和登出链接,指向passport

至此,应该能够实现我们最初的目标。

我再稍微总结一下:

passport实现的功能就是登陆时,自动登陆各个站点;登出时,自动登出所有站点。这里和通常意义的passport不一样,因为通常意义的passport一般就只有一个cookie。

一个新插入的子站点(不管自身项目还是开源项目),若想使用passport认证,则进行如下操作:

1、找到登陆的代码,套入passport提供的模板页面中;
2、找到登陆和登出的链接,指向passport;

当然,对于第二步来说,仍然比较困难,但是较之完全替换其帐户系统,理论上讲应该轻松许多,这也是我目前能想到的代价最小的实现Single Sign On的方式了。

由于这只是一些设想,跟曾毅和卢浩森聊了一下,据称问题不大,而且曾毅貌似已在音乐站上测试成功第一阶段的目标,所以特贴出来,看看各位达人认为:

1、有可行性么?
2、有没有其他更好更贴近栋力无限自身特点的方式?