中央认证服务 (CAS)
中央认证服务 (CAS) 是一个开源平台,它为 Web 应用和服务提供单点登录 (SSO) 认证。这意味着用户只需登录一次即可访问多个应用程序和服务,无需多次提供其凭据。CAS 广泛应用于教育机构和其他组织,以简化访问基于 Web 的资源的过程。
CAS 概述
CAS 基于 SAML 规范,并提供了一种集中式用户认证方式。它由两个主要组件组成:CAS 服务器和 CAS 客户端。CAS 服务器负责对用户进行身份验证并为其提供服务票证,该票证作为身份验证的证明。CAS 客户端集成到 Web 应用程序或服务中,负责向 CAS 服务器请求服务票证并验证它们。
CAS 服务器
CAS 服务器负责处理用户身份验证并颁发服务票证。它可以使用多种方法对用户进行身份验证,例如 LDAP、Kerberos 和数据库身份验证。CAS 还支持使用不同的 MFA 提供商(例如 Google、Yubikey 等)进行多因素身份验证 (MFA)。
CAS 使用简单的协议与 CAS 客户端进行通信。客户端向 CAS 服务器发送服务票证请求,这会提示用户进行身份验证。用户通过身份验证后,CAS 服务器会颁发服务票证,然后将其发送回客户端。
CAS 客户端
CAS 客户端集成到 Web 应用程序或服务中,负责向 CAS 服务器请求服务票证并验证它们。它是一个简单的库,可以添加到任何用任何编程语言编写的 Web 应用程序或服务中。
CAS 客户端使用服务票证来请求访问 Web 应用程序或服务的受保护资源。CAS 服务器验证服务票证,如果有效,则授予客户端访问受保护资源的权限。
代理
CAS 支持代理,允许 CAS 服务充当另一个服务的代理。这允许一层间接性,客户端向 CAS 服务进行身份验证,然后 CAS 服务代表客户端向目标服务进行身份验证。这在目标服务不支持 CAS 身份验证或客户端由于某种原因无法向目标服务进行身份验证的情况下非常有用。
要使用代理,必须将 CAS 服务器和目标服务配置为相互信任,并且客户端必须从 CAS 服务器请求代理授权票证 (PGT)。然后使用 PGT 从 CAS 服务器请求代理票证,该票证可用于访问目标服务。
委托身份验证
CAS 还支持委托身份验证,允许客户端使用与 CAS 服务提供的身份验证机制不同的身份验证机制向 CAS 服务进行身份验证。这在客户端已向其他服务进行身份验证并希望使用该身份验证访问受 CAS 保护的服务的情况下非常有用。
委托身份验证是使用一种称为代理身份验证票证 (PAT) 的特殊类型的服务票证来完成的。在客户端向委托身份验证服务进行身份验证后,CAS 服务器会颁发 PAT。然后,客户端可以向 CAS 服务器出示 PAT 以请求受 CAS 保护的服务的服务票证。
注销
CAS 提供对单点注销 (SLO) 功能的支持。它允许用户一次注销所有服务,而不是分别注销每个服务。一旦用户注销任何启用 CAS 的服务,它就会向 CAS 服务器发送注销请求,CAS 服务器又会向该用户已登录的所有其他服务发送注销请求。这样,用户已登录的所有服务都会立即注销。
要在 CAS 服务器上启用单点注销功能,您必须在应用程序服务器上配置 LogoutFilter、SingleSignOutFilter 和 SingleSignOutHttpSessionListener。
CAS 属性
CAS 还支持发布用户属性,这些属性可用于携带有关已认证用户的附加信息。CAS 客户端可以使用这些属性来做出授权决策或个性化用户体验。CAS 属性以键值对的形式返回,并且可以在 CAS 服务票证验证过程中请求。
总的来说,CAS 是一个强大、灵活且功能丰富的 SSO 身份验证解决方案,可以轻松集成到任何 Web 应用程序或服务中。虽然这些功能根据用例和业务需求可能会有所帮助,但了解如何正确使用和配置它们非常重要。
示例
以下是如何使用 CAS 客户端库将 CAS 身份验证添加到 Java Web 应用程序的示例:
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 是一个强大且广泛使用的解决方案,可为 Web 应用程序和服务提供 SSO 身份验证。它易于集成到任何 Web 应用程序或服务中,并支持各种身份验证方法和协议。借助 CAS,用户只需登录一次即可访问多个应用程序和服务,无需多次提供其凭据,这使得系统更安全、更易于管理,并且更不容易出现用户错误。