CAS 6.1 - Pac4J 的状态参数为空
CAS 6.1 - State Parameter null with 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
时,一切正常,但我想使用状态来保证安全。
在这个question in a pac4j google group中,有人遇到了同样的问题,因为他没有使用标准端口,我也是。但是更改为 80/443 并没有为我解决问题。我 运行 在 tomcat 9 中,在本地主机上有一个自签名的 ssl 证书。
还有其他建议吗?
编辑
我几乎可以肯定,问题出在外部 tomcat。但到目前为止,我还没有找到关于如何正确设置外部 tomcat 的工作文档。欢迎提出建议。
更新
像 cas-server-support-oauth-webflow
这样的接缝正在破坏 pac4j webflow。如果我删除此依赖项,它将起作用。不知道这是一个错误还是应该以这种方式工作。没有 OAuth-Webflow 我不会得到 access_token for Ldap/database.
我遇到了同样的问题,并设法用 v6.2.0-RC2
版本的 cas 解决了它。
添加后
cas.authn.pac4j.replicateSessions=false
进入我的 etc/cas/config/cas.properties
它解决了我的问题。
# 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
/**
* 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
。
我已经使用 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
时,一切正常,但我想使用状态来保证安全。
在这个question in a pac4j google group中,有人遇到了同样的问题,因为他没有使用标准端口,我也是。但是更改为 80/443 并没有为我解决问题。我 运行 在 tomcat 9 中,在本地主机上有一个自签名的 ssl 证书。
还有其他建议吗?
编辑
我几乎可以肯定,问题出在外部 tomcat。但到目前为止,我还没有找到关于如何正确设置外部 tomcat 的工作文档。欢迎提出建议。
更新
像 cas-server-support-oauth-webflow
这样的接缝正在破坏 pac4j webflow。如果我删除此依赖项,它将起作用。不知道这是一个错误还是应该以这种方式工作。没有 OAuth-Webflow 我不会得到 access_token for Ldap/database.
我遇到了同样的问题,并设法用 v6.2.0-RC2
版本的 cas 解决了它。
添加后
cas.authn.pac4j.replicateSessions=false
进入我的 etc/cas/config/cas.properties
它解决了我的问题。
# 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
/**
* 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
。