后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载导读本文围绕 Apereo CAS 的 OAuth/OIDC 授权端点防护机制展开讲解 CAS 如何拦截 OAuth 认证请求并通过 pac4j 的 CSRF Matcher 生成令牌将令牌同时暴露为pac4jCsrfToken请求属性与同名 Cookie并逐项剖析cas.authn.oauth.csrf-cookie配置前缀下的全部属性max-age、path、domain、same-site-policy、http-only、secure。读完本文你将掌握在 CAS 中为 OAuth 授权流程启用 CSRF 防护的完整配置方法并能从源码与测试层面理解该机制的底层实现原理。为什么 OAuth 授权端点需要 CSRF 防护OAuth 2.0 的授权端点authorization endpoint会接收来自浏览器重定向的请求并携带client_id、redirect_uri、scope等参数。攻击者可以利用跨站请求伪造CSRF / XSRF攻击诱导已登录的用户浏览器向授权端点发起非预期的授权请求从而可能触发恶意授权或会话相关操作。CAS 的 OAuth 模块给出的对策正如原文档 OAuth-Authentication-CSRF.md 所述Intercept the OAuth authentication request and URLs to generate CSRF tokens. This allows CAS to generate a CSRF token and save it as apac4jCsrfTokenrequest attribute and in thepac4jCsrfTokencookie.即CAS 拦截进入的 OAuth 认证请求与相关 URL为每次会话生成一个 CSRF 令牌并把它同时写入请求属性request attributepac4jCsrfToken同名 Cookiepac4jCsrfToken。这样后续需要提交表单或发起敏感操作的请求就可以携带该令牌进行校验而跨站攻击者无法读取或预测该 Cookie 的值从而阻断 CSRF 攻击路径。核心机制pac4j 的 CSRF Matcher 与令牌生成CSRF 防护能力并非 CAS 自研而是复用了 pac4j 安全框架提供的CsrfTokenGeneratorMatcher与DefaultCsrfTokenGenerator。CAS 在 OAuth 配置类 CasOAuth20Configuration.java 中将其组装为一个名为oauthSecCsrfTokenMatcher的 Spring BeanBean ConditionalOnMissingBean(name oauthSecCsrfTokenMatcher) RefreshScope(proxyMode ScopedProxyMode.DEFAULT) public Matcher oauthSecCsrfTokenMatcher(final CasConfigurationProperties casProperties) { val csrfMatcher new CsrfTokenGeneratorMatcher(new DefaultCsrfTokenGenerator()); val oauth casProperties.getAuthn().getOauth(); val csrfCookie oauth.getCsrfCookie(); val maxAge CookieUtils.getCookieMaxAge(csrfCookie.getMaxAge()); if (maxAge 0) { csrfMatcher.setMaxAge(maxAge); } csrfMatcher.setSameSitePolicy(csrfCookie.getSameSitePolicy()); csrfMatcher.setDomain(csrfCookie.getDomain()); csrfMatcher.setPath(csrfCookie.getPath()); csrfMatcher.setHttpOnly(csrfCookie.isHttpOnly()); csrfMatcher.setSecure(csrfCookie.isSecure()); return csrfMatcher; }从源码结构看这段代码揭示了三个关键实现事实令牌生成器DefaultCsrfTokenGenerator负责生成随机令牌值Cookie 落库CsrfTokenGeneratorMatcher负责把令牌写入pac4jCsrfTokenCookie 并暴露为请求属性配置映射cas.authn.oauth.csrf-cookie下的全部属性max-age、same-site-policy、domain、path、http-only、secure都会被逐一应用到该 Matcher 上最终由 pac4j 在写 Cookie 时生效。Matcher 如何挂载到 OAuth 认证流程在同文件中的oauthSecConfigBeanCasOAuth20Configuration.java中该 Matcher 被设置到 pac4j 的全局Config上val config new Config(callbackUrl, oauthSecConfigClients.toList()); config.setHttpActionAdapter(JEEHttpActionAdapter.INSTANCE); config.setWebContextFactory(JEEContextFactory.INSTANCE); config.setSessionStoreFactory(objects - oauthDistributedSessionStore); config.setMatcher(oauthSecCsrfTokenMatcher); config.setProfileManagerFactory(oauthSecProfileManagerFactory);Config.setMatcher(...)会把该 Matcher 注册为 pac4j 安全过滤器链中的全局匹配器这意味着进入 OAuth 授权流程的每个请求都会经过 CSRF 令牌的生成/校验逻辑。RefreshScope注解还表明该配置支持动态刷新运行期修改cas.authn.oauth.csrf-cookie.*配置项后可热生效具体刷新机制依赖 Spring Cloud 的配置刷新能力。配置属性全解cas.authn.oauth.csrf-cookie原文档通过 Jekyll 的casproperties标签直接引用了cas.authn.oauth.csrf-cookie属性组。该配置前缀在配置模型中对应OAuthProperties#csrfCookie字段见 OAuthProperties.java实际类型为 OAuthCsrfCookieProperties.java它继承自通用的CookieProperties因此全部 Cookie 属性均可配置。属性总览表配置项前缀cas.authn.oauth.csrf-cookie类型默认值说明max-ageString时长-1Cookie 最大存活秒数。-1表示会话级 Cookie浏览器关闭即失效正数表示 N 秒后过期0表示立即删除该 CookiepathString空字符串Cookie 可见路径。留空则由运行时计算默认路径domainString空字符串Cookie 所属域名例如.example.org。默认仅返回给发送方服务器same-site-policyString空字符串SameSite 策略可选Lax、Strict、None留空则由默认策略决定http-onlybooleanfalse是否启用 HttpOnly 属性详见下文默认值说明securebooleanfalse是否仅允许通过 HTTPS 发送该 Cookie详见下文默认值说明默认值细节与 pac4j 默认行为对齐值得特别注意的是 OAuthCsrfCookieProperties.java 中的构造函数public OAuthCsrfCookieProperties() { setSecure(false); setHttpOnly(false); }它的 Javadoc 明确解释了设计意图将默认值设置为与 pac4j 的默认值一致pac4j 的 CSRF Cookie 默认不启用 Secure 与 HttpOnly。而 CAS 通用CookieProperties的默认值恰好相反secure true、httpOnly true见 CookieProperties.java因此OAuthCsrfCookieProperties必须在构造时显式覆盖以免改变 pac4j 的既有行为。同时该类注释还说明了两个关键约定maxAge 语义pac4j 使用Integer表示 maxAge默认值为nullCAS 只有在该值大于-1时才调用csrfMatcher.setMaxAge(...)见上文 Bean 源码中的if (maxAge 0)判断否则保持 pac4j 的默认行为不显式设置Cookie 名称不可配置CSRF Cookie 的名称固定为pac4jCsrfToken不提供配置入口这与原文档中保存为pac4jCsrfTokencookie的描述一致。属性在底层如何生效以same-site-policy为例CookieProperties的 JavadocCookieProperties.java提醒现代浏览器采用secure-by-default模型若使用SameSiteNone实现跨站 Cookie 访问则必须同时携带Secure属性否则浏览器会拒绝该 Cookie。因此在跨域如前端与 CAS 分属不同站点的 OAuth 场景下通常需要组合配置cas.authn.oauth.csrf-cookie.same-site-policyNone cas.authn.oauth.csrf-cookie.securetrue而path、domain则直接控制 Cookie 的作用域path决定哪些 URL 路径下回传 Cookiedomain决定哪些主机回传 Cookie两者共同约束了 CSRF 令牌的可见范围是防止令牌被不必要地泄露给无关站点的第一道边界。完整配置示例以下配置基于仓库中的单元测试 OAuth20CSRFCookieTests.java 给出的真实属性组合整理可直接作为生产配置的起点# CSRF Cookie 有效期3600 秒1 小时 cas.authn.oauth.csrf-cookie.max-age3600 # Cookie 作用路径 cas.authn.oauth.csrf-cookie.path/cas # SameSite 策略跨站场景使用 None需配合 securetrue cas.authn.oauth.csrf-cookie.same-site-policyNone # 禁止脚本访问缓解 XSS 窃取令牌 cas.authn.oauth.csrf-cookie.http-onlytrue # 仅允许 HTTPS 传输 cas.authn.oauth.csrf-cookie.securetrue # 限定 Cookie 域名 cas.authn.oauth.csrf-cookie.domainmellon.edu如果部署在 HTTPS 环境且业务为同站访问也可以选择更保守的策略组合cas.authn.oauth.csrf-cookie.same-site-policyLax cas.authn.oauth.csrf-cookie.http-onlytrue cas.authn.oauth.csrf-cookie.securetrue cas.authn.oauth.csrf-cookie.max-age-1其中max-age-1是默认值表示会话级 Cookie浏览器关闭后令牌即失效适合对令牌生命周期要求苛刻的安全场景。测试用例验证仓库在 OAuth20CSRFCookieTests.java 中提供了针对该配置类的直接验证TestPropertySource(properties { cas.authn.oauth.csrf-cookie.max-age3600, cas.authn.oauth.csrf-cookie.path/cas, cas.authn.oauth.csrf-cookie.same-site-policyNone, cas.authn.oauth.csrf-cookie.http-onlytrue, cas.authn.oauth.csrf-cookie.securetrue, cas.authn.oauth.csrf-cookie.domainmellon.edu }) class OAuth20CSRFCookieTests extends AbstractOAuth20Tests { Test void verifyPropertiesSet() { val csrfCookie casProperties.getAuthn().getOauth().getCsrfCookie(); assertEquals(3600, csrfCookie.getMaxAge()); assertEquals(/cas, csrfCookie.getPath()); assertEquals(None, csrfCookie.getSameSitePolicy()); assertEquals(mellon.edu, csrfCookie.getDomain()); assertTrue(csrfCookie.isHttpOnly()); assertTrue(csrfCookie.isSecure()); } }该测试自 6.4.0 版本起引入作者 Hal Deadman通过TestPropertySource注入全部 CSRF Cookie 属性并断言casProperties.getAuthn().getOauth().getCsrfCookie()能正确读取到每一项值。它同时证明了配置前缀cas.authn.oauth.csrf-cookie的属性绑定路径测试类标记了Tag(OAuthWeb)归类于 OAuth Web 层测试套件随cas-server-support-oauth模块的测试一起执行。应用前提与注意事项模块依赖CSRF Cookie 配置声明在cas-server-support-oauth模块配置模型标注RequiresModule(name cas-server-support-oauth)使用前需确保该模块已包含在 CAS 部署中Cookie 基础能力依赖cas-server-core-cookie模块。功能开关整个 OAuth 配置类由ConditionalOnFeatureEnabled(feature CasFeatureModule.FeatureCatalog.OAuth)控制即仅当 OAuth 特性被启用时才装配 CSRF Matcher。Cookie 名称固定pac4jCsrfToken名称不可配置前端或客户端脚本若需要读取该令牌应以该名称为准。Secure 与 SameSiteNone 的搭配若配置same-site-policyNone而未启用securetrue主流浏览器会拒绝该跨站 Cookie导致 CSRF 令牌无法正常写入务必按上文组合配置并确保站点运行于 HTTPS。默认行为差异CAS 为 OAuth CSRF Cookie 覆盖了CookieProperties的默认值securefalse、httpOnlyfalse与 pac4j 默认行为保持一致若安全策略要求更严格的 Cookie必须显式设置http-onlytrue与securetrue。配置热刷新oauthSecCsrfTokenMatcher标注了RefreshScope在支持配置刷新的部署形态下调整cas.authn.oauth.csrf-cookie.*后可通过刷新机制动态生效无需重启节点。结语CAS 借助 pac4j 的CsrfTokenGeneratorMatcher在 OAuth 授权流程中构建了以pac4jCsrfTokenCookie 与请求属性为载体的 CSRF 防护层并通过cas.authn.oauth.csrf-cookie配置前缀将 Cookie 的 max-age、path、domain、SameSite、HttpOnly、Secure 等全部要素开放给运维与安全人员。理解其默认值设计与 pac4j 对齐与 Secure/SameSite 的组合约束是在生产环境中正确启用该能力的关键。相关实现与验证可直接参考 CasOAuth20Configuration.java、OAuthCsrfCookieProperties.java 与 OAuth20CSRFCookieTests.java。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS 集成 Apache Cassandra 认证配置详解与源码剖析Apereo CAS 集成 Apache Cassandra 认证配置详解与源码剖析 本文基于 Cassandra Authentication.md htt后端认证鉴权单点登录Apereo CAS 认证事件 Redis 存储Redis Authentication Events 配置与实现详解Apereo CAS 认证事件 Redis 存储Redis Authentication Events 配置与实现详解 在 Apereo CAS 中认证事件后端认证鉴权单点登录Apereo CAS中SAML2 NameID配置详解Apereo CAS中SAML2 NameID配置详解 什么是NameID 在SAML协议中NameID是一个核心概念它代表了认证主体用户的唯一标识符。后端认证鉴权单点登录上一篇LoginCritter自定义主题终极指南打造个性化动画登录界面下一篇Notepad--自动认出 GBK 的跨平台文本编辑器乱码老项目 10 分钟救回来创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
