1 一个问题诊断

系统做了单点登录,用的是CAS,用户反馈偶尔系统登出之后,重新用其他帐号登入,查询 到的用户资料依然是上一个用户的,只有关闭浏览器之后,才能正常。

从直观上判断,应该是session问题,询问了一下应用开发人员,确认用户id存放在session 中。只有为啥session没有销毁成功,简单做法就是抓包分析。

先是用wireshark在客户端做了分析,发现在出现问题的时候,系统去请求出现问题的页面 不会做跳转(初次访问该页面需要去cas登入),也就是说对于业务系统来说,jsessionid 依然有效。

了解了一下cas的原理:用户去portal平台做登入,从cas获取到TGT。第一次访问业务模块 的时候,由于没有session,会创建一个session,然后重定向到sso做登入。而注销的时候 cas负责销毁创建的session。从故障看,问题就是出现在销毁session上。

通过tcpdump来抓包: sso服务器端:

[root@localhost ~]# tcpdump -p -nn -s 0 tcp port 8088 and host 172.16.102.205  -w sso.dump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

应用端:

[root@trust-test-app ~]# tcpdump -p -nn -s 0 host 172.17.102.106 and not tcp port 8001 -w sso-logout.dump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

用wireshark分析包,可以看到CAS发出去的销毁session请求被reset,查看了一下环境,问 题出现在apache上,询问了一下,apache是自己编译的,而且配置文件也是乱七八糟,没想 明白为啥被reset而不是connection reject之类的,修改apache配置问题解决。

当然也不能算彻底解决,CAS关于注销的实现有bug,是一个不可靠实现,需要做一定处理。



blog comments powered by Disqus