一年多内,涉及到了两类的单点登陆系统。第一类的原意,是各模块可以相互独立,拥有(或者不拥有)相应的用户数据库。实际上用户状态是存在各模块里,在模块与数据库中不存在验证用户的数据层。各模块内部都需要建立webservice,并且需要引用想要跳转的模块的webservice。这样做的好处是各模块本身可以独立运作,但带来的问题是添加模块或者模块数量多的时候,引用的处理就会比较复杂,同时session的建立是由已登陆模块控制的,并不受目标模块的控制。
过程大约是这样的:A模块有登陆状态,当要跳转到B的时候,通过接口发送当前用户信息,如B模块查询到用户的时候,在B对应的数据库里建立记录和随机数,将随机数发回,A将这数加在B模块专门的页面连接的后边并打开相应连接。B模块通过随机数找到相应用户后,建立用户环境并删除随机数。
第二类是采用类似统一的中间验证组件的形式,有专门的一个application用来做这方面的验证。用户登陆是在该组件里进行登陆的,用户状态也存在这里面,当其他的application需要验证时,才与该application进行交互。这种模式也是相对较为通用的模式。
验证层部分的用户状态维护,用session是不行的,没有办法获取到。至于cookie,也要分不同的状况。最初的考虑是直接使用.net自带的用户验证方法,或者是用浏览器进程的cookie,但是这两种都无法获取到cookie值的。而如果设置一下cookie的时间,就能得到cookie了。
这里不得不提醒一个比较麻烦的问题:浏览器。我一直是用maxthon的,结果这个浏览器既自动使用同一个session又自动使用同一份cookie,于是无论session还是.net的验证票都能获取到,而使用IE是取不到的。所以测试的时候需要注意一下。