CAS

2023-03-22 11:29 星期三

协议概述

CAS(Central Authentication Service)中央认证服务,一种独立开放指令协议,旨在为 Web 应用系统提供一种可靠的单点登录方法。

名词解释

  • CAS Server:单点登录认证服务器。
  • CAS Client:单点登录客户端。
  • Service Ticket:服务票据,CAS Server签发的一张一次性票据,CAS Client使用ST与CAS Server进行交互,获取验证状态。

登录流程

  1. 用户通过浏览器访问CAS Client的某个界面。
  2. 当CAS Client判断用户需要进行身份认证时,携带service返回302状态码,指示浏览器重定向到CAS Server。
  3. 用户输入认证信息,如果登录成功,CAS Server随机产生一个唯一的Service Ticket,并缓存以待将来验证。
  4. CAS Server拼接Service Ticket到Service中,并重定向到Service所在地址。
  5. CAS Client 在拿到 Service 和新产生的 Service Ticket 后,调用 CAS Server 提供的接口对 Service Ticket 进行核实,以确保 Service Ticket 的合法性。
  6. Service Ticket 核实通过后,CAS Server 返回对应的登录用户身份。

开发详情

步骤1:

  • 引入CAS相关开发包,例如JAVA可考虑引入spring-security-cas;
  • 做好相关CAS配置;

步骤2:

  • 获取 Service Ticket,用户登录应用系统时,应用系统判断用户是否登录,如未登录,则跳转到CAS Server登录页面。
https://demo.cloudentify.com/api/authz/cas/< appkey >/login
  • 用户在CAS Server认证成功后,CAS Server会携带ticket重定向到应用系统。
http(s)://< redirectUrl > ? ticket = < ticket >

注:redirectUrl在CAS Server平台配置。

  • 验证Service Ticket并获取账号,CAS Server对 Service Ticket 进行验证,验证成功后,返回登录用户身份。
https://demo.cloudentify.com/api/authz/cas/{appkey}/serviceValidate?service = < service > & ticket = < ticket >
  • service:应用系统地址;
  • ticket: Service Ticket;
  • CAS Server:返回响应报文。
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
 <cas:authenticationSuccess>
   <cas:user>username</cas:user>
   <cas:attributes>
        <cas:nickname>test</cas:nickname>
        <cas:name>jack</cas:name>
        <cas:phonesn>13000000000</cas:phonesn>
        <cas:authorization>{…}</cas:authorization>
   </cas:attributes>
   <cas:proxyGrantingTicket>PGTIOU-84678-8a9d...</cas:proxyGrantingTicket>
  </cas:authenticationSuccess>
</cas:serviceResponse>
  • cas:user:用户名;
  • cas:nickname: 用户别名;
  • cas:name: 用户姓名;
  • cas:phonesn: 用户手机;
  • cas:authorization:角色/资源授权信息,格式参考OIDC步骤4获取用户信息中的authorization。

登录态注销(退出登录):

  • 业务系统主动调用飞天云信注销登录状态。
HTTP Method:GET
https://demo.cloudentify.com/api/authz/cas/{appkey}/logout

注:{appkey}为接入系统的唯一标识,需要从IAM获取。

请求参数:

casService:业务系统地址,非必填。

  • 业务系统被动等待飞天云信调用注销用户登录状态。

业务系统提供登出回调URL,接口描述如下:

HTTP Method:POST
Header Content-Type:application/x-www-form-urlencoded
http(s)://appdomain/uri

logoutRequest:退出请求数据,该数据具体格式如下:

<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID=" FT_e56687f6-7244-4253-a554-36363159b573" Version="2.0" IssueInstant="2022-07-26T02:41:31.596Z">
<saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">testuser</saml:NameID>
<samlp:SessionIndex> eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIzIiwiaWF0IjoxNjU4OD …</samlp:SessionIndex>
</samlp:LogoutRequest>

数据参数解释:

NameID: 用户名(登录时获取的cas:user参数);

SessionIndex:身份标识(登录时提供的ticket将放于此处)。