CAS票据验证失败一例

       最近在弄cas的集成,搞了好几天,被一个问题搞得很郁闷,今天总算是解决了,在此记录一下解决的过程。

       先说一下cas的背景,我们知道cas分为服务端和客户端,认证的过程是

       1. 用户访问客户端应用,被拦截跳转到cas服务端登录

       2. 登录完成后,服务端签发一个TGC,把TGC的ID写到客户端的cookie,并再次跳转到客户端,同时带着ST票据

       3. 客户端发现有ST则拿着ST去服务端验证,如果验证通过,则返回用户名

       4. 客户端发现用户名,则登录成功

       5. 用户访问另一个客户端,也被拦截,跳转到cas服务端,服务端发现有TGC的cookie,就直接验证,如果验证通过,则直接签发一个ST票据给客户端,后面流程就和上面一样了。

       项目背景是原来一个公司K的cas服务端3.5和他们公司的一个.net的应用A集成是正常的,现在另一家公司插入进来换掉了cas服务端,用的是cas4.0,想和应用A集成,却发现一直集成不了。而他们和其它公司的.net系统集成都正常。最后叫我帮忙处理。

       我按照常规的方法去集成,发现cas服务端能签发ST出来,但是A系统一直报错说无效票据,因为我是搞java的,不太清楚.net,所以也没法看代码,只能凭经验来判断问题。

       首先我觉得cas能签发票据,说明登录成功了,我于是弄了一个java的应用来接入,发现接入正常,可以实现单点登录。这下就奇怪了,难道A应用的客户端有问题?于是我找到K公司的应用A(是部署在另一个客户那的,我是K公司出来的,和原同事熟,所以弄了个测试应用来接入测试),试着接入,发现报一样的错,这说明客户端的部署没问题,难道A应用的客户端被改过,不是标准客户端?于是我问原来的同事,他们都说没有改过,这下陷入僵局。

      第二天我想不如我自己部署一个cas来测试,有可能是对方cas服务器有问题,于是我下载了一个cas4.0,部署到我的机器上,用花生壳软件发布到外网,然后先用我的java应用接入测试, 一切正常,于是把A系统接入进来,又是票据无效!!!这下懵了,什么情况,难道是cas版本问题?我不服,于是又下了一个cas3.5再试,还是票据无效!!!

      我冷静的想了想,票据能签发成功,验证失败了,票据无效是系统A报出来的,cas服务端没有任何报错信息,一定要去看系统A的源代码看是什么情况,于是我在网上找了一个dll的反编译工具Reflector, 把系统A的客户端dll下载过来反编译看,发现是去服务端验证的时候没有返回回来用户名,把系统A抛出了票据无效的错误。

      这时候我突然想到一个问题,我自己的java系统是有安装证书的,但是系统A那边没有安装证书,问原来同事都说不用安装证书,但是K公司的cas服务端用的是http协议,而现在我这边cas和新公司的cas服务端都是用的https协议,使用https应该是需要证书的,是不是因为没有证书的问题导致票据验证失败?

     于是我试着把我的cas服务端改成http协议,再测试,一切顺利,原来真是证书的问题,也就是说如果使用https,那边客户端要安装证书,如果使用http,则不用证书。

     至此问题解决, 我叫对方公司把他们的服务端改成http,或者签发一个证书给系统A。

你可能感兴趣的:(单点登录)