中央认证服务(CAS)
中央认证服务(CAS)是一个开源的平台,为网络应用和服务提供单点登录(SSO)认证。这意味着用户只需登录一次,就可以访问多个应用程序和服务,而不必多次提供他们的凭证。CAS被广泛用于教育机构和其他组织,以简化访问基于网络的资源的过程。
CAS概述
CAS以SAML规范为基础,提供了一种集中式的用户认证方式。它由两个主要组件组成:CAS服务器和CAS客户端。CAS服务器负责认证用户并为他们提供服务票据,作为认证的证明。CAS客户端被集成到网络应用程序或服务中,负责从CAS服务器请求服务票并验证它们。
CAS Server
CAS服务器负责处理用户认证和发行服务券。它可以使用各种方法对用户进行认证,如LDAP、Kerberos和数据库认证。CAS还支持多因素认证(MFA),使用不同的MFA供应商,如google、yubikey等。
CAS使用一个简单的协议来与CAS客户端进行通信。客户端向CAS服务器发送一个服务票的请求,服务器提示用户进行认证。一旦用户通过了认证,CAS服务器就会发出一张服务票,并将其发回给客户端。
CAS Client
CAS客户端被集成到网络应用程序或服务中,负责从CAS服务器请求服务票据并验证它们。它是一个简单的库,可以添加到用任何编程语言编写的任何网络应用或服务中。
CAS 客户端使用服务票据来请求访问网络应用程序或服务的受保护资源。CAS服务器验证服务票据,如果它是有效的,则授予客户对受保护资源的访问权。
Proxying
CAS支持代理,这允许一个CAS服务作为另一个服务的代理。这允许一个层次的间接性,即客户端向CAS服务进行认证,而CAS服务又代表客户端向目标服务进行认证。这在目标服务不直接支持CAS认证,或者客户端由于某种原因无法认证到目标服务的情况下是非常有用的。
要使用代理,CAS服务器和目标服务必须被配置为相互信任,并且客户端必须从CAS服务器请求一个代理授权票(PGT)。然后,PGT被用来向CAS服务器请求一个代理票,该代理票可用于访问目标服务。
委托认证
CAS也支持委托认证,它允许客户使用不同于CAS服务所提供的认证机制来认证CAS服务。这在客户已经认证了不同的服务,并希望使用该认证来访问受CAS保护的服务的情况下可能很有用。
委托认证是通过一种特殊的服务票据完成的,称为代理认证票据(PAT)。PAT是由CAS服务器在客户对委托认证服务进行认证后发出的。然后,客户可以向CAS服务器出示PAT,以便为受CAS保护的服务请求一张服务票。
Logout
CAS提供对单次登录(SLO)功能的支持。它允许用户一次注销所有的服务,而不是分别注销每个服务。一旦用户从任何一个启用了CAS的服务中注销,它就会向CAS服务器发送注销请求,而CAS服务器又会向该用户登录过的所有其他服务发送注销请求。通过这种方式,所有用户登录过的服务都会被一次性注销。
为了在CAS服务器上启用单点登录功能,你必须在你的应用服务器上配置LogoutFilter、SingleSignOutFilter和SingleSignOutHttpSessionListener。
CAS属性
CAS还支持用户属性的发布,这些属性可以用来携带关于认证用户的额外信息。这些属性可以被CAS客户端用来做授权决定,或个性化用户体验。CAS属性以键值对的形式返回,并且可以作为CAS服务票据验证过程的一部分被请求。
总的来说,CAS是一个强大的、灵活的、功能丰富的SSO认证解决方案,可以很容易地集成到任何Web应用程序或服务中。虽然这些功能可以根据用例和业务要求而有所帮助,但了解如何正确使用和配置它们是很重要的。
示例
下面是一个例子,说明如何使用CAS客户端库将CAS认证添加到Java网络应用程序中 –
import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter;
...
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CasProperties casProperties;
@Autowired
private CasAuthenticationProvider casAuthenticationProvider;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilter(casAuthenticationFilter())
.addFilter(casValidationFilter())
.addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class);
}
private AuthenticationFilter casAuthenticationFilter() {
AuthenticationFilter filter = new AuthenticationFilter();
filter.setCasServerUrlPrefix(casProperties.getServerUrlPrefix());
filter.setServerName(casProperties.getServerName());
return filter;
}
private Cas20ProxyReceivingTicketValidationFilter casValidationFilter() {
Cas20ProxyReceivingTicketValidationFilter filter = new Cas20ProxyReceivingTicketValidationFilter();
filter.setCasServerUrlPrefix(casProperties.getServerUrlPrefix());
filter.setTicketValidator(new Cas20ServiceTicketValidator(casProperties.getServerUrlPrefix()));
filter.setAuthenticationUserDetailsService(new UserDetailsByNameServiceWrapper<>(new RemoteUserDetailsService(casProperties)));
return filter;
}
private Cas20ServiceTicketValidator cas20ServiceTicketValidator() {
return new Cas20ServiceTicketValidator(casProperties.getServerUrlPrefix());
}
private AuthenticationUserDetailsService authenticationUserDetailsService() {
return new UserDetailsByNameServiceWrapper<>(new RemoteUserDetailsService(casProperties));
}
}
在这个例子中,我们使用CAS客户端库中的AuthenticationFilter和Cas20ProxyReceivingTicketValidationFilter类来处理服务票的认证和验证。我们也有额外的类,如Cas20ServiceTicketValidator、authenticationUserDetailsService,这些类正在被实例化。
我们还使用一个CasProperties Bean,它包含CAS服务器和客户端的配置信息。这使我们能够轻松地配置服务器的URL前缀和认证过滤器和验证过滤器的服务器名称。
我们还添加了过滤器singleSignOutFilter,它将负责处理单次签出功能,它将被添加到CasAuthenticationFilter之前。
结论
CAS是一个强大和广泛使用的解决方案,为网络应用和服务提供SSO认证。它很容易集成到任何网络应用程序或服务中,并支持各种认证方法和协议。在CAS的帮助下,用户可以一次登录并获得对多个应用程序和服务的访问权,而不必多次提供他们的凭证,这使得系统更安全、更容易管理、更不容易发生用户错误。