CAS 6.1 - 使用 Pac4J 的状态参数空



我已经用LDAP/AD和数据库设置了CAS,它有效。现在我想添加Keycloak,但我得到了一个关于状态的例外。

Caused by: org.pac4j.core.exception.TechnicalException: State parameter is different from the one sent in authentication request. Session expired or possible threat of cross-site request forgery

为了进行测试,我添加了Google,但出现了类似的问题。

DEBUG [org.pac4j.oauth.credentials.extractor.OAuth20CredentialsExtractor] - <sessionState: null / stateParameter: Optional[TST-1-v1va-S-4rLb45kax1568WxwP5aX-q2X]>
INFO [org.pac4j.oauth.client.Google2Client] - <Failed to retrieve or validate credentials: State parameter mismatch: session expired or possible threat of cross-site request forgery>

我可以在日志中看到 keyloak/google 都有令牌的成功身份验证,这意味着 keycloak/google 原则上可以工作。问题是,在重定向回 CAS 后,会话已经结束。上下文中的会话存储为空。因此,状态为空,无法与 TST 匹配。当我在 pac4j 中设置withState = false时一切正常,但我想使用状态来确保安全。

在pac4j google组中的这个问题中,有人遇到了同样的问题,因为他没有使用标准端口,而我也这样做了。但是更改为 80/443 并没有为我解决它。我在本地主机上使用自签名 ssl 证书在 tomcat 9 中运行。

还有其他建议吗?

编辑
我几乎可以肯定,问题出在外部雄猫身上。但是到目前为止,我还没有找到有关如何正确设置外部tomcat的工作文档。欢迎提出建议。


cas-server-support-oauth-webflow这样的更新接缝正在破坏 pac4j 网络流。如果我删除此依赖项,它可以工作。不知道这是一个错误还是应该以这种方式工作。如果没有OAuth-Webflow,我无法获得Ldap/database的access_token。

我遇到了同样的问题,并设法用v6.2.0-RC2版本的 cas 来处理它。 添加后

cas.authn.pac4j.replicateSessions=false

进入我的etc/cas/config/cas.properties它为我解决了问题。

从 https://github.com/apereo/cas/blob/v6.2.0-RC2/docs/cas-server-documentation/configuration/Configuration-Properties.md#pac4j-delegated-authn:

# cas.authn.pac4j.typedIdUsed=false
# cas.authn.pac4j.principalAttributeId=
# cas.authn.pac4j.name=
# cas.authn.pac4j.order=
# cas.authn.pac4j.lazyInit=true
# cas.authn.pac4j.replicateSessions=true

从 https://github.com/apereo/cas/blob/v6.2.0-RC2/api/cas-server-core-api-configuration-model/src/main/java/org/apereo/cas/configuration/model/support/pac4j/Pac4jDelegatedAuthenticationProperties.java#L58:

/**
* Indicates whether profiles and other session data,
* collected as part of pac4j flows and requests
* that are kept by the container session, should be replicated
* across the cluster using CAS and its own ticket registry.
* Without this option, profile data and other related
* pieces of information should be manually replicated
* via means and libraries outside of CAS.
*/
private boolean replicateSessions = true;

警告- 此属性的默认值为true,并且不会对群集重新注释更改为false

相关内容

  • 没有找到相关文章

最新更新