协议概述
CAS(Central Authentication Service)中央认证服务,一种独立开放指令协议,旨在为 Web 应用系统提供一种可靠的单点登录方法。
名词解释
- CAS Server:单点登录认证服务器。
- CAS Client:单点登录客户端。
- Service Ticket:服务票据,CAS Server签发的一张一次性票据,CAS Client使用ST与CAS Server进行交互,获取验证状态。
登录流程
- 用户通过浏览器访问CAS Client的某个界面。
- 当CAS Client判断用户需要进行身份认证时,携带service返回302状态码,指示浏览器重定向到CAS Server。
- 用户输入认证信息,如果登录成功,CAS Server随机产生一个唯一的Service Ticket,并缓存以待将来验证。
- CAS Server拼接Service Ticket到Service中,并重定向到Service所在地址。
- CAS Client 在拿到 Service 和新产生的 Service Ticket 后,调用 CAS Server 提供的接口对 Service Ticket 进行核实,以确保 Service Ticket 的合法性。
- 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将放于此处)。