CAS 6.1 - нулевой параметр состояния с Pac4J

Я настроил CAS с LDAP/AD и базой данных, которая работает. Теперь я хочу добавить 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. Когда я установилwithState = false в pac4j все работает, но я хочу использовать состояние для безопасности.

В этом вопросе в группе pac4j google у кого-то была такая же проблема, потому что он не использовал стандартный порт, что я тоже использовал. Но переход на 80/443 не решил для меня. Я работаю в tomcat 9 с самоподписанным сертификатом ssl на localhost.

Есть другие предложения?

Изменить
Я почти уверен, проблема связана с внешним котом. Но пока я не нашел рабочей документации о том, как правильно настроить внешний tomcat. Открыт для предложений.

Обновить
швы какcas-server-support-oauth-webflowнарушает веб-поток pac4j. Если я удалю эту зависимость, все заработает. Не знаю, является ли это ошибкой или должно так работать. Без OAuth-Webflow я не получаю access_token для Ldap/database.

1 ответ

Решение

У меня была такая же проблема, и мне удалось справиться с ней с помощью 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:

# 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:

 /**
 * 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 не рекомендуется для кластеров.

Другие вопросы по тегам