SSO解决方案探索(WEB)
1:场景
某公司下有三个站点。A.com,B.com和C.com。要求某用户在A.com下登陆后在浏览B.com和C.com的时候不用再登陆了。这里的A.com,B.com和C.com是三个不同的域名。
大概的流程我想应该是这样的
1:用户来到A.com,在登录界面上输入用户名和密码,点击登录按钮
2:浏览器向A.com的服务端发送请求,请求提供的信息是用户名和密码
3:在服务端利用用户名和密码向数据库查询是否存在该行数据
4:如果存在某行数据则返回用户的信息(用户ID)并告知B.com和C.com该用户已经登录,如果不存在某行数据则提示用户重新输入用户名和密码或是注册新用户。
我们可以看到通过以上四部我们是可以实现我们最重要的目的“全站通行”。如果我们同意这个说法,那我们接着往下看。
到这里我们就剩下一下问题了,那就是“如何告知B.com和C.com该用户已经登录”。我们可以有两种方案,客户端方案和服务端方案。
2:场景的解决方案
2.1:客户端方案
只所以说他是客户端方案,是因为我们的通知事件的发起者在客户端。大体上我们可以如下这样做:
我们先来看看序列图
图就相对简单,这里就不画了。
这个方案大体上是这样的,我们独立出来一下LoginServer,它用来处理验证用户信息和获取所有域名列表。当登录的时候用它检测用户信息,检测通过的话再获取所用域名,最后把用户信息Post到域名列表下的各个域名(各个域名下有个相同的逻辑来吧这些信息写到Cookies里面)。
2.2服务端的解决方案
这里我们说说服务端是如何通知的。
先看看序列图
再看看部署图
这个和客户端方案的区别就是把用户的登录信息保存在服务端(像CLoginServer),当用户登录的时候中心认证服务会把认证通过的信息分发到各个子认证服务中(如果子认证服务物理上不是一台机器的需要中心认证服务把认证信息发送到主子认证服务然后主子认证服务再分发到副子认证服务中)。在认证服务中存储的是各个域名下已经登录的所用用户的信息。
备注:
1:图中出现的各个逻辑单元可以简单的认为是一台物理机器也可以认为是一组物理机器提供了某一服务。
园中更加详细的介绍(部分连接)
http://blog.csdn.net/cityhunter172/archive/2005/12/31/567479.aspx
http://www.cnblogs.com/luck0235/archive/2009/08/05/1539906.html
http://crazysoul.javaeye.com/blog/23674