CAS 登录错误之 Your CAS credentials were rejected.

项目中cas登录时候碰到一个bug,登录不成功显示Your CAS credentials were rejected.Reason为空.

虽然出现频率不高,但是影响比较大,不能登录啊!虽然重新在浏览器输入server的地址就可以直接访问了,代表之前登录实际上成功。

思路很简单,第一步要重现。
1.watij模拟30个用户同时登录,后面发现登录的用户都是相同,原来watij不能模拟多个浏览器进程,测试无效。换到selenium2.9就解决了这个问题,打开30个浏览器,设置登录延迟100ms,模拟30个不同用户在服务器上面同时登录,只重现了一次,本地服务器可以多次重现。

2.Debug 发现异常 org.jasig.cas.client.validation.TicketValidationException: 未能够识别出目标 'ST-1-ncWS6TkNVKJac2Py6O1E-cas'票根
来自下列代码
ProviderManager.authenticate ()
CasAuthenticationProvider.authenticate()
AbstractUrlBasedTicketValidator.validate(ticket, service)
Cas20ServiceTicketValidator.parseResponseFromServer(response)


即浏览器在cas服务器输入密码后,带着st到跳转到service server上面获取资源,这个时候service server需要到cas server验证上面的票根,但是不知道什么原因票根在cas server验证的时候抛出的异常是无效票根。

3.Google原因
找到cas 关于st过期时间设置在 ticketExpirationPolicies.xml中,默认是st只能使用一次 ,10秒钟过期,由于服务器一些资源限制,当验证时间超过10秒这次验证就不通过,但是用户包含tgt,所以解释了上面说的用户重新输入service地址就不需要再登录了。

解决问题 :改成5分钟过期,问题就木有了。基本上从用户输入密码获取到st到service验证票根肯定可以在5分钟内搞定。




CAS 协议从几个方面让 Service Ticket 变得更加安全。
l         Service Ticket 只能使用一次。
CAS 协议规定,无论 Service Ticket 验证是否成功, CAS Server 都会将服务端的缓存中清除该 Ticket ,从而可以确保一个 Service Ticket 被使用两次。
l         Service Ticket 在一段时间内失效。
假设用户拿到 Service Ticket 之后,他请求 helloservice 的过程又被中断了, Service Ticket 就被空置了,事实上,此时, Service Ticket 仍然有效。 CAS 规定 Service Ticket 只能存活一定的时间,然后 CAS Server 会让它失效。通过在 web.xml 中配置下面的参数,可以让 Service Ticket 在多少秒内失效。
<context-param>
<param-name>edu.yale.its.tp.cas.serviceTimeout</param-name>
<param-value>300</param-value>
</context-param>
       该参数在业务应用的条件范围内,越小越安全。
l         Service Ticket 是基于随机数生成的。
Service Ticket 必须足够随机,如果 Service Ticket 生成规则被猜出(如果你使用了 ST+Helloservice+ 自增序列的方式, Hacker 就可以构造下一个 Ticket ), Hacker 就等于绕过 CAS 认证,直接访问所有服务。


 

你可能感兴趣的:(cas)