关于sso单点登录系统的一些想法
今天晚上跟朋友聊sso,简单整理了下思路,特此记录。
系统方案基于httpservice,在此不探讨用户注册、停用等问题,只探讨登录问题。
必要条件:客户端需要维护自己的session队列,系统基于session实现单点登录
客户端、服务器端均需要提供几个连接 session注销、session登录、session校验等几个url
用户登录,当用户请求需要权限页面时,首先请求"session校验"判断用户是否已经在服务器登录了,如果已经登录服务器返回登录用户名信息,完成登录,否则跳转到服务器"session登录"完成用户登录,并跳转回原页面。
当用户在客户端点击注销按钮通知服务器用户注销,服务器发送到所有客户端"session注销"通知此用户下线。
服务器需要维护各个客户端sessionid与服务器sessionid的对应关系,注销时直接通过sessionid通知客户端做相应操作即可。
sso服务器主要工作需要维护各个客户端的sessioid对应关系、并定时轮询客户端"session校验",维护session,保证用户不失效。
sso服务器如果重启后,原有客户端的session注销会存在异常,但是这种异常通常是短时间的, 当客户端session失效异常即可消除,目前没有想到好的方法解决这个问题。
重启后,sso服务器应该立即对所有客户端的session进行轮询,将服务器数据队列完成创建,以便用户登录sso时完成对了同步。
要解决的话就必须保证浏览器客户端访问一次sso服务器,当完成一次访问后即可完成对列的维护。
此方案可以解决基于cookie的sso问题
缺点,不能实现匿名登录,不过应该可以变相实现,问题不大。
另外,必须保证sso服务器高可用,一旦当机可能会造成系统大面积无法登陆系统,导致系统瘫痪。
?
1 楼 xuwenkeke 2010-11-07 可以考虑使用耶鲁大学开源项目 http://www.jasig.org/cas引用另外,必须保证sso服务器高可用,一旦当机可能会造成系统大面积无法登陆系统,导致系统瘫痪。
耶鲁的CAS中, 有解决的方案. 2 楼 jinyanhui2008 2010-11-07 xuwenkeke 写道可以考虑使用耶鲁大学开源项目 http://www.jasig.org/cas
引用另外,必须保证sso服务器高可用,一旦当机可能会造成系统大面积无法登陆系统,导致系统瘫痪。
耶鲁的CAS中, 有解决的方案.
呵呵,CAS我是知道的,不过没有仔细研究,因为我们公司有成熟的SSO产品,这个主要是跟以哥们聊天闲聊时总结的,顺手给记下来的
3 楼 grandboy 2010-11-07 建议下次再记录的时候画一个图,不单大家看着方便,您将来自己看起来也更清晰。
这个思想都差不多,我以前接触过商业的产品,不过最近也要考虑自己给公司内容的产品实现一个了。所以对这个话题有点兴趣,不过看文字绕来绕去的比较累,不过还是看完了。 4 楼 xsharp 2010-11-08 楼主可以再深入一些, 其实目前有不少开放的完善的协议可以借鉴. 5 楼 jinyanhui2008 2010-11-08 grandboy 写道建议下次再记录的时候画一个图,不单大家看着方便,您将来自己看起来也更清晰。
这个思想都差不多,我以前接触过商业的产品,不过最近也要考虑自己给公司内容的产品实现一个了。所以对这个话题有点兴趣,不过看文字绕来绕去的比较累,不过还是看完了。
呵呵,这个想法是基于我们公司产品实施以及工作中遇到的实际问题总结的,这个只能算是一个解题思路,具体实现还是没有考虑,因为公司毕竟有成熟的产品。 6 楼 jitabc 2010-11-08 josso很方便滴。 7 楼 ywlqi 2010-11-08 <div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>今天晚上跟朋友聊sso,简单整理了下思路,特此记录。<br><br>系统方案基于httpservice,在此不探讨用户注册、停用等问题,只探讨登录问题。<br>必要条件:客户端需要维护自己的session队列,系统基于session实现单点登录<br><br>客户端、服务器端均需要提供几个连接 session注销、session登录、session校验等几个url<br><br>用户登录,当用户请求需要权限页面时,首先请求"session校验"判断用户是否已经在服务器登录了,如果已经登录服务器返回登录用户名信息,完成登录,否则跳转到服务器"session登录"完成用户登录,并跳转回原页面。<br>当用户在客户端点击注销按钮通知服务器用户注销,<span style="color: #ff0000;">服务器发送到所有客户端"session注销"通知此用户下线</span>。<br>服务器需要维护各个客户端sessionid与服务器sessionid的对应关系,注销时直接通过sessionid通知客户端做相应操作即可。<br><br>sso服务器主要工作需要维护各个客户端的sessioid对应关系、并<span style="color: #ff0000;">定时轮询客户端"session校验",</span>维护session,保证用户不失效。<br><br>sso服务器如果重启后,原有客户端的session注销会存在异常,但是这种异常通常是短时间的, 当客户端session失效异常即可消除,目前没有想到好的方法解决这个问题。<br>重启后,sso服务器应该立即对所有客户端的session进行轮询,将服务器数据队列完成创建,以便用户登录sso时完成对了同步。<br>要解决的话就必须保证浏览器客户端访问一次sso服务器,当完成一次访问后即可完成对列的维护。<br><br>此方案可以解决基于cookie的sso问题<br><br>缺点,不能实现匿名登录,不过应该可以变相实现,问题不大。<br>另外,必须保证sso服务器高可用,一旦当机可能会造成系统大面积无法登陆系统,导致系统瘫痪。</p>
<p>?</p>
</div>
<p>基于什么样的考虑需要这种解决方案?</p> 8 楼 jinyanhui2008 2010-11-08 <div class="quote_title">ywlqi 写道</div>
<div class="quote_div">
<div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>今天晚上跟朋友聊sso,简单整理了下思路,特此记录。<br><br>系统方案基于httpservice,在此不探讨用户注册、停用等问题,只探讨登录问题。<br>必要条件:客户端需要维护自己的session队列,系统基于session实现单点登录<br><br>客户端、服务器端均需要提供几个连接 session注销、session登录、session校验等几个url<br><br>用户登录,当用户请求需要权限页面时,首先请求"session校验"判断用户是否已经在服务器登录了,如果已经登录服务器返回登录用户名信息,完成登录,否则跳转到服务器"session登录"完成用户登录,并跳转回原页面。<br>当用户在客户端点击注销按钮通知服务器用户注销,<span style="color: #ff0000;">服务器发送到所有客户端"session注销"通知此用户下线</span>。<br>服务器需要维护各个客户端sessionid与服务器sessionid的对应关系,注销时直接通过sessionid通知客户端做相应操作即可。<br><br>sso服务器主要工作需要维护各个客户端的sessioid对应关系、并<span style="color: #ff0000;">定时轮询客户端"session校验",</span>维护session,保证用户不失效。<br><br>sso服务器如果重启后,原有客户端的session注销会存在异常,但是这种异常通常是短时间的, 当客户端session失效异常即可消除,目前没有想到好的方法解决这个问题。<br>重启后,sso服务器应该立即对所有客户端的session进行轮询,将服务器数据队列完成创建,以便用户登录sso时完成对了同步。<br>要解决的话就必须保证浏览器客户端访问一次sso服务器,当完成一次访问后即可完成对列的维护。<br><br>此方案可以解决基于cookie的sso问题<br><br>缺点,不能实现匿名登录,不过应该可以变相实现,问题不大。<br>另外,必须保证sso服务器高可用,一旦当机可能会造成系统大面积无法登陆系统,导致系统瘫痪。</p>
<p>?</p>
</div>
<p>基于什么样的考虑需要这种解决方案?</p>
</div>
<p>这个也没基于什么,主要是闲聊时说起来的,具体实现未深入考虑</p> 9 楼 flysnowxf 2010-11-08 引用sso服务器如果重启后,原有客户端的session注销会存在异常,但是这种异常通常是短时间的, 当客户端session失效异常即可消除,目前没有想到好的方法解决这个问题。
你是说sso服务器重启后,服务端的session会丢失?session可以通过memcached之类的分布式缓存保存在其他地方,不要和sso服务器放在一起。 10 楼 jinyanhui2008 2010-11-09 flysnowxf 写道引用sso服务器如果重启后,原有客户端的session注销会存在异常,但是这种异常通常是短时间的, 当客户端session失效异常即可消除,目前没有想到好的方法解决这个问题。
你是说sso服务器重启后,服务端的session会丢失?session可以通过memcached之类的分布式缓存保存在其他地方,不要和sso服务器放在一起。
这个可以考虑,呵呵,又学了一招