最近在项目中debug验证ST票据之后返回值时,发生了ST票据验证错误的异常。
org.jasig.cas.client.validation.TicketValidationException:
Ticket ‘ST-80-FFSThMbPg2dMee3eFveu-8080’ not recognized
经过研究CAS服务器端代码发现,原来是CAS服务器的ST票据有效期时间太短,默认是10秒。开发在debug时,非常容易超过10秒,所以会发生TicketValidationException异常。
解决方法:要在CAS服务器端修改两处配置
1 修改保存在Redis或Memcached等缓存中的票据本身的有效期。
在WEB-INF/spring-configuration/ticketRegistry.xml文件中修改。
<bean id="ticketRegistry" class="com.casserver.ticket.TicketRegistry">
<constructor-arg index="0" ref="redisClient" />
<!-- TGT timeout in seconds -->
<constructor-arg index="1" value="28800" />
<!-- ST timeout in seconds 将默认时间由10秒改为 1800秒(半小时) -->
<constructor-arg index="2" value="1800" />
<!-- <property name="kryoTranscoder" ref="kryoTranscoder" /> -->
</bean>
2 修改CAS服务器本身的超时判断时间。
在WEB-INF/cas.properties中修改。也是将默认时间由10秒改为 一个大一点的数字,如1800秒(半小时)
##
# Service Ticket Timeout
# Default sourced from WEB-INF/spring-configuration/ticketExpirationPolices.xml
#
# Service Ticket timeout - typically kept short as a control against replay attacks, default is 10s. You'll want to
# increase this timeout if you are manually testing service ticket creation/validation via tamperdata or similar tools
# st.timeToKillInSeconds=10
st.timeToKillInSeconds=1800
改好之后,用postman做个测试。
成功了,不再出现TicketValidationException异常了。