CAS 6.0 和 Spring Security:服务票证验证时 JWT 配置失败

Posted

技术标签:

【中文标题】CAS 6.0 和 Spring Security:服务票证验证时 JWT 配置失败【英文标题】:CAS 6.0 and Spring Security: JWT configuration fails on Service Ticket validation 【发布时间】:2020-03-22 02:40:52 【问题描述】:

我正在使用 CAS 6.0 和带有 Spring Security 的 Spring Boot 设置配置,以便转移到 JWT。查看this 指南,我已经配置了模块依赖项、CAS 服务注册表以及签名和加密密钥。流程很顺利:

在 https://localhost:9000/secure/home/test 调用应用程序我被重定向到 CAS 登录, https://localhost:8443/cas/login?service=https%3A%2F%2Flocalhost%3A9000%2Flogin%2Fcas 我可以正确指定凭据并在 cookie 中以 JWT 形式查看 TGC, 插入凭据后,我被重定向到https://localhost:9000/login/cas。

最后一次调用有两个查询字符串参数redirect=true 和ticket=[JWT string]。 我已经设置了一个过滤器来解码令牌并且它可以工作,但是过滤器链会命中 CasAuthenticationFilter,它会看到票证参数并尝试将其验证为服务票证,但失败了。

如何让它知道jwt,并将请求转发到原始URL?

【问题讨论】:

【参考方案1】:

CAS 5.3.x 中的相同问题。

最后我做了以下流程:

CAS 服务器

    在cas服务器中设置cas.properties,添加'cas.ticket.st.numberOfUses=2'让service ticket可以被使用两次。 (默认值为 1)

应用服务器

    设置过滤器来解码 JWT 令牌,从 JWT 令牌中的密钥“jti”中提取服务票证。 将响应状态设置为302并重定向到请求url,并将服务票证作为查询字符串命名为“票证”。 (注意在这一步不应该继续下一个过滤器) 来自 #2 的重定向请求不应在 #1 的过滤器中处理,然后进入过滤器链。

上述流程有效。但需要更多测试以确认 Web 应用程序和结果 api 服务的工作正常。

【讨论】:

这听起来像是一个可行的解决方案。不幸的是,我更改了配置以使其正常工作,除非回滚所有内容,否则无法对其进行测试。无论如何,实施这种 hack 来避免 CAS 记录的配置给出的错误对我来说仍然很奇怪。谢谢。 抱歉,我输入了错误的键名,请将 cas.ticket.st.numberOfUser=2 更正为 cas.ticket.st.numberOfUses=2。我已经更正了我的答案。谢谢

以上是关于CAS 6.0 和 Spring Security:服务票证验证时 JWT 配置失败的主要内容,如果未能解决你的问题,请参考以下文章

Spring-security-cas 插件单点注销不起作用

使用 Spring Security 和 CAS 单点注销

具有 CAS 身份验证和自定义授权的 Spring Security

使用 CAS + Spring Security 实现 SSO

spring security+cas(cas proxy配置)

spring security+cas(cas proxy配置)