CAS SSO bug fix

文章目录

  • 前言
    • SSO流程
      • 流程中注意的地方
  • 跨域问题
  • 缓存问题
  • 总结

前言

单点登录(Single Sign On , 简称 SSO)是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。Yale大学CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架.
使用该框架出现下面两个bug:

  • logout需要刷新才能自动跳转到login
  • ST(Service ticket)和URL不符

#Cookie和Session
这篇博客不错
cookie浏览器,session服务器,session安全存敏感,cookie长效不安全

#CAS
这篇博客不错
##术语
 CAS的核心就是其Ticket,及其在Ticket之上的一系列处理操作。CAS的主要票据有TGT、ST、PGT、PGTIOU、PT,其中TGT、ST是CAS1.0(基础模式)协议中就有的票据,PGT、PGTIOU、PT是CAS2.0(代理模式)协议中有的票据。只关心CAS1.0
###TGT(Ticket Grangting Ticket)
sever存放的session

###TGC (Ticket-granting cookie)
broswer存放的cookie

###ST(ServiceTicket)
Cas20ProxyReceivingTicketValidationFilter验证

###之间的关系
服务器端存放Session(TGC.A->TGT1(cookie,userinfo),TGC.B->TGT2,…)
浏览器端存放Cookie(TGC(sessionid),TGC2,…)

SSO流程

没有看源码,通过理解博客内容所画,等待看过源码后发现又没有错误。
CAS SSO bug fix_第1张图片

Created with Raphaël 2.2.0 Broswer request service AuthenticationFilter Check Cookie Cache Check ST Cas20ProxyRecevingTicketValiditionFilter Validate ST service Exception Check TGC in Cookie Generate ST Return service URL with ST and Broswer save TGC,Will Restart this flow but with TGT and TGC Return loginURL with service Authenticate Save TGT yes no yes no yes no yes no yes no

流程中注意的地方

  • 配置单点登出,一定要按照SingleSignOutHttpSessionListener->SingleSignOutFilter->AuthenticationFilter->Cas20ProxyReceivingTicketValidationFilter->HttpServletRequestWrapperFilter->AssertionThreadLocalFilter的顺序
  • AuthenticationFilter和Cas20ProxyReceivingTicketValidationFilter在认证或验证ST通过后可以通过设置中的serverName、service来配置重定向地址,区别是serverName可以带参数而service是固定地址。

跨域问题

##什么是跨域
这篇博客不错
JavaScript同源策略的限制

##解决
前台不用深入,几个关键点如下:

  1. 因为是JS的问题,后台访问没有问题
  2. 新版支持添加header,支持跨域。前提是response有这个头(可以后台加filter人为添加),然后ajax用指定方法访问

缓存问题

这个回答不错
这个回答还行

总结

针对前言中的两个bug:
1.logout

  • 原来是添加了id=logout的点击事件,事件中ajax 先访问logout的servlet,servlet只清理本地缓存,然后js中访问CASlogout地址。为防止跨域问题,改为直接跳转(href)logout,然后在servlet中sendRedirect到CAS的logout。
  • 经过验证,CAS顺序等配置没有问题,最后返现是chrome的缓存问题,尽管我指定了index.html中的head不缓存,但是chrome还是缓存,所以只能为CAS logout重定向地址指向如下:
String location = "https://cas.zyxing.com/caso/logout?service=http://flightlivewatch.flight.zyxing.com/index.html?timestamp=" + timestamp;

2.验证ST不符报错

  • 可以设置不报错
  • 根本原因是使用了短域名,导致存储的TGT和访问地址不一致,导致报错

你可能感兴趣的:(瞎搞)