• 1. 统一认证2018/10/22厦门统一认证项目组1
  • 2. 目录 UAS登录总体设计 UAS登录总体流程 UAS登录具体业务 UAS登录技术实现2018/10/22厦门统一认证项目组21234
  • 3. 2018/10/22厦门统一认证项目组3 UAS登出总体设计 UAS登出总体业务 UAS登录总体流程 UAS登出技术实现5768
  • 4. UAS登录总体设计 第一次用户访问接入系统时,客户端过滤器过滤请求,试图从请求获取ST ID和session中Assertion。由于是第一次访问,客户端的过滤器获取不到它们的值,所以把请求【/login】重定向到uas服务器,uas服务器从客户端获取TGT ID,此时TGT ID 为空,uas服务器返回登录页面,要求用户重新认证。用户输入正确的用户和密码,uas服务器产一个TGT,并把该TGT存在uas服务器本地的cache中以及cookie中;同时uas服务器也产生一个ST,把ST 存入uas服务器本地的cache中。把ST通过报文的形式返回给客户端。客户解析报文、获取ST,并向给UAS服务器发送请求,要求UAS服务器认证ST。UAS服务器处理该请求,验证ST的有效性。ST验证成功,则UAS服务器获取用户在该接入系统的信息,把该信息封装成一个对象Assertion,并把该Assertion对象通过报文发送给客户端,客户端解析报文获得Assertion对象,把Assertion对象包装在request和session中。此后接入系统从request中获取Assertion对象,从而获得用户相关信息,因此用户成功访问接入系统。 用户在再次访问系统时,由于客户端中的Assertion对象不为空,则接入系统直接从session中获得Assertion对象进而获得用户的相关信息。如果用户访问其他接入系统时,此会话中的Assertion为空,客户端向uas服务器发送请求,uas服务器从客户端的cookie中获取TGT ID,但server不为空,则UAS服务器产生ST ID ,并ST ID 存入服务器本地缓冲cache中,同时把ST ID通过给客户端,客户端获得ST ID 之后,向UAS服务器发送请求,要求认证ST。UAS服务器成功认证ST之后,UAS服务器把用户的信息封装在Assertion对象,并把该Assertion对象通过报文发送给客户端,客户端解析报文获得Assertion对象,把Assertion对象包装在request中。此后接入系统从request中获取Assertion对象,从而获得用户相关信息,因此用户成功访问接入系统。从而实现SSO单点登录2018/10/22厦门统一认证项目组4
  • 5. 2018/10/22厦门统一认证项目组 5UAS登录总体流程5
  • 6. UAS登录业务实现 【1】用户在浏览器输入接入系统的地址,由于第一次访问该接入系统,接入系统的客户端把请求重地向到UAS服务器。 【2】uas服务器根据cookie的名字试图从会话cookie中获取TGT ID,由于获取不到该值,uas服务器向浏览器发送登录首页 【3】用户在登录首页向uas服务器提交用户名和密码 【4】 uas服务器处理请求,请求的步骤如下: (1)uas服务器判断此时的用户名是否被人使用登录过,如果被登录过,登记【剔人日志】 (2)uas服务器校验用户名和密码,如果校验失败,uas服务器就返回登录首页给用户,要求用户重新认证 (3)uas服务器校验用户的状态是否为注销状态,如果注销, uas服务器返回登录首页,要求用户重新认证 (4)uas服务器校验密码的有效期是否有效,如果失效,uas返回登录首页,要求用户重新认证 (5)uas服务器校验密码的状态是否锁定,如果锁定,uas返回登录首页,要求用户重新认证 (6)uas服务器生成TGT ,并把TGT 分别存在会话cookie和缓冲中 (7)uas服务器校验用户是否有权限进入接入系统 (8)uas服务器成功校验TGT的有效性(包括时间有效性、使用次数有效性)。校验成功之后生成ST,并在uas服务器存储ST与接入系统的关系,以便在单点退出时通知接入系统 (9)把之前产生的ST存在缓冲中,把ST发送给接入系统。 2018/10/22厦门统一认证项目组 6
  • 7. 【5】接入系统的客户端获取到ST之后,把ST跟会话做一次映射,并把这映射关系存储起来以便实现后面的单点登出业务,同时ST发送给uas服务器作校验 【6】 uas成功校验ST之后,记入审计日志(用户登录过该接入系统)并获取用户在这个接入系统的信息,并把这些信息通和TGT ID过报文的形式发送给接入系统的客户端,最后使ST失效,并从缓冲中删除。(是否使ST失效,决定于ST的策略;把TGT也发送给接入系统的目的是实现剔人业务 ) 【7】接入系统的客户端解析该报文,获取用户的信息,同时把这些信息和TGT封装在assertion对象中,并把该对象封装在当前会话中,这样的话,用户再次访问该接入系统时,接入系统的客户就会认为用户已经成功认证、无需重新认证。此后接入系统的客户端又把TGT ID发送uas服务器,uas服务器根据TGT ID从缓冲中找出对应的TGT 。如果TGT 的状态不为空,uas服务器发送信息给接入系统的客户端。接入系统的客户端让当前用户登出该接入系统;反之, uas服务器通知接入系统当前用户可以继续访问本接入系统。最后接入系统的客户端把assertion对象重新包装在request中,同时为它备份一个副本。 【8】此后,接入系统通过Assertion对从request中获取用户的相关信息,从实现了登录。2018/10/22厦门统一认证项目组 7
  • 8. 【9】这时用户在浏览器输入接入系统B的访问地址,由于第一次访问该接入系统,接入系统B的客户端把请求重地向到UAS服务器 【10】uas服务器根据cookie的名字从会话cookie中获取到TGT ID,说明用户已经登录认证过。 【11】uas服务器校验TGT的有效性(包括时间有效性、使用次数有效性)。校验成功之后生成ST,并在uas服务器存储ST与接入系统的关系,以便在单点退出时通知接入系统,同时把该ST存在缓冲中,把ST发送给接入系统B的客户端。 【12】接入系统的客户端获取到ST之后,把ST跟会话做一次映射,并把这映射关系存储起来以便实现后面的单点登出业务,同时ST发送给uas服务器作校验 uas成功校验ST之后,记入审计日志(用户登录过该接入系统)并获取用户在这个接入系【13】统的信息,并把这些信息通和TGT ID过报文的形式发送给接入系统的客户端,最后使ST失效,并从缓冲中删除。(是否使ST失效,决定于ST的策略;把TGT也发送给接入系统的目的是实现剔人业务 ) 【14】接入系统的客户端解析该报文,获取用户的信息,同时把这些信息和TGT封装在assertion对象中,并把该对象封装在当前会话中,这样的话,用户再次访问该接入系统时,接入系统的客户就会认为用户已经成功认证、无需重新认证。此后接入系统的客户端又把TGT ID发送uas服务器,uas服务器根据TGT ID从缓冲中找出对应的TGT 。如果TGT 的状态不为空,uas服务器发送信息给接入系统的客户端。接入系统的客户端让当前用户登出该接入系统;反之, uas服务器通知接入系统当前用户可以继续访问本接入系统。最后接入系统的客户端把assertion对象重新包装在request中,同时为它备份一个副本。 【15】此后,接入系统通过Assertion对从request中获取用户的相关信息,从实现了SSO单点登录 2018/10/22厦门统一认证项目组 8
  • 9. UAS登录技术实现【步骤一】在浏览器上输入接入系统的访问地址。客户端的过滤器SingleSignOutFilter拦截该访问请求,获取Ticket的值(artifactParameterName默认值是ticket)。获取不到ticket的值,则进入下一个过滤器AuthenticationFilter 【涉及的类:SingleSignOutFilter.java】 【步骤二】过滤器AuthenticationFilter,从session获取Assertion对象。Assertion对象为空,说明用户尚未登录过。重组URL,把请求重定向到uas。 【涉及的类:AuthenticationFilter.java】 【步骤三】uas服务器端调用login-webflow流处理该请求。通过cookie 的名称【UASTGC】从客户端获取cookie的值,该cookie值就是TGT ID。 【涉及的类:InitialFlowSetupAction.java】 【步骤四】由于用户第一次登录,TGT ID为空、gateway为空,跳转casLoginview.jsp 【备注:casLoginview.jsp是uas登录的首页】 【步骤五】在uas服务端的登录页面【casloginView.jsp】上输入用户名和密码,提交到后台处理。后台把页面上信息(比如用户名、密码) 封装在具体credentials对象的属性上 (UasAuthenticationViaFormAction.java中的bind())。 【涉及的类:UasAuthenticationViaFormAction.java】 【备注:UasAuthenticationViaFormAction.bind()的主要功能是收集页面上用户登录的凭证信息(用户名和密码),然后把这些信息封装在credentials中。用户在casloginView.jsp上点击提交,会触发此方法】 2018/10/22厦门统一认证项目组9
  • 10. 【步骤六】判断是否重复登录:如果重复登录了,则根据用户输入用户名从TGT缓冲中获取对应的TGT,并获的该TGT 的IP。获取请求的IP,对比这两个IP是否一致,如果不一致的话,则登记【剔人日志】。并把该TGT的状态设置为客户端的IP,并把该TGT存入缓冲cache中(本场景是没有重复登录,直接进入【步骤七】) 【涉及的类:UasAuthenticationViaFormAction.java】 【步骤七】判断是否需要ST凭证。(本场景是不需要,直接进入【步骤八】) 【涉及的类:UasAuthenticationViaFormAction.java】 【备注如果是renew为true,则需要重新认证】 【步骤八】验证用户名、密码,如果验证成功,则产生TGT,并把TGT ID 放在request 范围(RequestContext)之内和缓冲cache中,清空客户端的warnCookie(本场景中用户输入正确的用户名和密码) 【涉及的类:UasAuthenticationViaFormAction.java】 2018/10/22厦门统一认证项目组 10
  • 11. 【步骤九】判断登录成功类型(判断用户的密码是否在有效期内,用户的状态是否正常、用户名是否存在)。 【涉及的类:UasAuthenticationViaFormAction.java】 【步骤十】把TGT放进TGT cookie中,缓冲到客户端的浏览器中。 【备注:把TGT存在客户端的目的:在切换系统的时候,uas服务器从客户端的Cookie中获取TGT,验证TGT的有效性】 【涉及的类:SendTicketGrantingTicketAction.java】 【步骤十一】由于server对象不为空【用户输入接入系统的访问地址】,判断用户是否有权限访问接入系统 (GenerateServiceTicketAction.java 中的doExecute()):。如果没有权限则跳转到permissionError.jsp页面,终止下面步骤,否则进入【步骤十二】(PermissionControlService. Java中的doFilter()方法)(本场景用户有权限访问该接入系统) 【涉及的类:GenerateServiceTicketAction.java】 【步骤十二】用之前从cookie中获得TGT ID从缓冲cache中去查找对应的TGT,并验证TGT的有效性,如果找得到或者验证成功,产生ST 【涉及的类:TicketGrantingTicketImpl.java中的方法grantServiceTicket()】 【步骤十三】把ST放进缓冲cache中,并ST ID放进request 范围之内(GenerateServiceTicketAction.java 中方法doExecute()) 【涉及的类:GenerateServiceTicketAction.java】 【注意:根据配置文件ticketRegistry.xml ST在缓冲中的生命周期是60秒;根据ticketExpirationPolicies.xml而ST有效期是30秒】 2018/10/22厦门统一认证项目组11
  • 12. 【步骤十四】通过REDIRECT重定向的形式向客户端发送ST, 【备注:主要通过配置文件login-webflow.xml 中的 】 【涉及的主要类:Response.java】 格式:http://客户端:端口号/uasclient/;jsessionid=seession ID ?ticket=ST-1-dUxkgm21-uas 【步骤十五】客户端的过滤器SingleSignOutFilter过滤该请求(更新本地的存储器中的session)—> 过滤器AuthenticationFilter过滤该请求(request范围内ticket的值不为空,流程进入下一个过滤器)—>过滤器 Cas20ProxyReceivingTicketValidationFilter过滤该请求,向UAS服务器的接口【/serviceValidate】发送请求的,验证ST的有效性 【步骤十六】cas服务器的接口【/serviceValidate】,通过ST ID从缓冲中获取TGT,通过ST ID从缓冲中获取ST。 【涉及的类:ServiceValidateController.java】 【步骤十七】如果ST验证成功,则获取用户在该接入系统下的信息userMap(比如机构、角色、条线等信息)。(ReturnInfoService.java中getAllUserInfo()方法)。根据ST的失效策略(ST仅使用一次),让ST失效同时从缓冲中删除(本场景成功验证ST 【涉及的类:ServiceValidateController.java、CentralAuthenticationServiceImpl.java 中validateServiceTicket()】 2018/10/22厦门统一认证项目组 12
  • 13. 【步骤十八】登记用户登录接入系统的日志 ,跳转向casServiceValidationSuccess.jsp,通过该页面并向客户端发送报文 【涉及的类:ServiceValidateController.java】 【步骤十九】客户端获取该报文对该报文进行解析,把解析的后的报文封装在Assertion对象中,把该对象放进session中,然后把请求重定向到比如http://172.18.2.114:8888/uasclient/ 【172.18.2.114:8888是servername,这个是在web.xml配置的】 【注意 这时Assertion对象中有TGT ID】 【涉及的类:Cas20ProxyReceivingTicketValidationFilter.java和Cas20ServiceTicketValidator.java解析报文用的】 【步骤二十】cas客户端拦截该请求,SingleSignOutFilter过滤该请求 过滤器AuthenticationFilter过滤该请求过滤器Cas20ProxyReceivingTicketValidationFilter过滤该请求HttpServletRequestWrapperFilter过滤器过滤处理该请求:从request中获取session,在从session中获取Assertion,在把Assertion对象的一个属性AttributePrincipal包装在对象CasHttpServletRequestWrapper中,使其后面的过滤或者request.getRemoteUser()或者request.getUserPrincipal()获取用户的信息,然后接着过滤该请求 【涉及的类:HttpServletRequestWrapperFilter.java】 2018/10/22厦门统一认证项目组13
  • 14. 【步骤二十一】AssertionThreadLocalFilter将用户信息存放于ThreadLocal对象中。 【涉及的类:AssertionThreadLocalFilter.java】 【步骤二十二】接入系统从request对象中获得Assertion,从而获得用户信息。 【步骤二十三】用户成功登录接入系统 【备注:】 【1】SingleSignOutFilter.java中artifactParameterName:指定request保存service的参数名称, 默认为ticket 【2】gateway--指定是否使用防火墙,有效值是true和false,默认是false 【3】serviceParameterName—指定request保存service的默认参数。 【4】renew—指定是否通过认证,都要重新登录一次 2018/10/22厦门统一认证项目组 14
  • 15. UAS登出总体设计 用户通过浏览器向UAS服务器发起登出申请,UAS服务器通过cookie name获取客户端的cookie,而这个cookie ID就是TGT ID,UAS服务器用TGT ID从缓冲cache中获取TGT ,设置TGT为失效。通过TGT ,UAS获取那些用户通过该TGT登录过接入系统的地址以及其ST,然后向这些接入系统发送报文,通知它们该用户已经实行登出操作,同时把TGT ID从缓冲中删除。被通知的那些接入系统获取并解析报文,把ST ID和session从本地存储器中删除,并把Session失效2018/10/22厦门统一认证项目组15
  • 16. UAS登出总体流程
  • 17. UAS登出业务实现【1】用户通过浏览器向uas服务器发起登出请求 【2】uas服务器获取会话cookie,从而得到TGT ID,根据TGT ID 在uas服务器的缓冲中得到对应的TGT,设置TGT为失效,并从缓冲中删除,之后清除上述cookie,最后从本地的存储器中获得该用户登录过接入系统信息,并向这些接入系统发送用户登出的通知 【3】 这些接入系统接收到通知后,把本接入系统对应的会话失效。这样的话,用户想继续登录接入系统的话,接入系统的客户端要求用户重新登录,从而实现了单点登录登出。2018/10/22厦门统一认证项目组 17
  • 18. UAS登出技术实现【步骤一】接入系统发起一个链接【http:/cas服务器IP:端口/logout】。 【步骤二】 cas服务器中的一个servlet调用一个接口,该接口【LogoutController】负责处理该请求【/logout】 【步骤三】接口【LogoutController】获取客户端的名为UASTGC的cookie,而这个cookie的值就是TGT ID。 【涉及的类:LogoutController.java】 【步骤四】通过TGT ID从服务器缓冲cache中获得TGT,从TGT中获取相关的登录信息并用这些信息登记日志 【涉及的类CentralAuthenticationServiceImpl.java中destroyTicketGrantingTicket()】 【步骤五】把名为UASTGC和UASPRIVACY的两个cookie的值设置为空,缓冲到客户端。 【涉及的类:LogoutController.java】 【步骤六】设置TGT的状态设置为【失效】,同时以Post形式向各个用户登录过的接入系统发送报文(报文部分信息ST ID),然后把该TGT从缓冲cache中删除,然后重定向一个页面casLogoutView.jsp 【涉及的类:LogoutController.java和AbstractWebApplicationService.java】 【步骤七】客户端中过滤器SingleSignOutFilter拦截该报文,解析该报文,获得ST ID,通过ST ID取得对应的session,删除客户端本地的session和ST ID并设置该session为失效。 【涉及的类:SingleSignOutFilter.java】 2018/10/22厦门统一认证项目组18
  • 19. UAS项目中cookie的应用 Cookie 分成两种:一种持久化cookie,一种是会话cookie;持久化cookie存在本地硬盘中;cookie存在浏览器的内存中;持久化cookie可以在不同浏览器中实现共享,会话cookie在不同的浏览器中不能实现共享;持久化cookie不因浏览器的关闭而删除除非其生命周期结束,会话cookie浏览器关闭就被删除。 UAS项目采用会话cookie(根据配置文件ticketGrantingTicketCookieGenerator.xml) 2018/10/22厦门统一认证项目组 19
  • 20. UAS项目中Ehcache的应用(ticketRegistry.xml配置)以TGT的缓冲配置为例: 2018/10/22厦门统一认证项目组 20
  • 21. 2018/10/2221
  • 22. 谢谢,欢迎交流想法!2018/10/22厦门统一认证项目组22