6.4. 退出
您可以从 Web 应用注销的方法有多种。对于 Jakarta EE servlet 容器,您可以调用 HttpServletRequest.logout ()
。对于任何其他浏览器应用程序,您可以在具有安全约束的 Web 应用程序的任何 url 中点浏览器,并传递查询参数 GLO,即 http://myapp?GLO=true
。如果您有带有浏览器的 SSO 会话,这将退出。
6.4.1. 在集群环境中注销 复制链接链接已复制到粘贴板!
在内部,SAML 适配器会在 SAML 会话索引、主体名称(已知)和 HTTP 会话 ID 之间存储映射。此映射可以在 JBoss 应用服务器系列中维护(WildFly 10/11,EAP 6/7),以用于可分布式应用。作为 precondition,HTTP 会话需要在集群中分发(例如,应用程序在应用程序的 web.xml
中被标记为 < ;distributable
/> 标签)。
要启用功能,请在 /WEB_INF/web.xml
文件中添加以下部分:
<context-param> <param-name>keycloak.sessionIdMapperUpdater.classes</param-name> <param-value>org.keycloak.adapters.saml.wildfly.infinispan.InfinispanSessionCacheIdMapperUpdater</param-value> </context-param>
<context-param>
<param-name>keycloak.sessionIdMapperUpdater.classes</param-name>
<param-value>org.keycloak.adapters.saml.wildfly.infinispan.InfinispanSessionCacheIdMapperUpdater</param-value>
</context-param>
如果部署的会话缓存被命名为 deployment-cache
,用于 SAML 映射的缓存将命名为 deployment-cache.ssoCache
。缓存的名称可以被上下文参数 keycloak.sessionIdMapperUpdater.infinispan.cacheName
覆盖。包含缓存的缓存容器将与包含部署会话缓存的缓存容器相同,但可以被一个上下文参数 keycloak.sessionIdMapperUpdater.infinispan.containerName
覆盖。
默认情况下,SAML 映射缓存的配置将派生自会话缓存。可以在服务器的缓存配置部分中手动覆盖配置,与其他缓存相同。
目前,为了提供可靠的服务,建议将复制缓存用于 SAML 会话缓存。使用分布式缓存可能会导致 SAML 注销请求进入没有访问 SAML 会话索引的节点到 HTTP 会话映射,这会导致注销失败。
6.4.2. 在跨站点场景中注销 复制链接链接已复制到粘贴板!
处理跨越多个数据中心的会话需要特殊处理。想到以下场景:
- 登录请求在数据中心 1 中的集群内处理。
- 管理员发出特定 SAML 会话的注销请求,即数据中心 2 中的请求登录。
数据中心 2 必须注销数据中心 1 中(以及共享 HTTP 会话的所有其他数据中心)存在的所有会话。
要涵盖这种情况,上述 SAML 会话缓存不仅需要在单个集群中复制,例如通过独立的 Infinispan/JDG 服务器复制所有数据中心:
- 缓存必须添加到独立 Infinispan/JDG 服务器。
- 上一项中的缓存必须添加为相应 SAML 会话缓存的远程存储。
在部署期间发现 SAML 会话缓存上存在远程存储后,将监视是否有更改,并将相应地更新本地 SAML 会话缓存。