ToB企服应用市场:ToB评测及商务社交产业平台

标题: keycloak~token配置相关说明 [打印本页]

作者: 大连全瓷种植牙齿制作中心    时间: 2024-10-23 08:29
标题: keycloak~token配置相关说明
会话有效期

在 Keycloak 中,"SSO Session Idle" 和 "SSO Session Max" 是用于配置单点登录(SSO)会话的两个参数。这两个参数影响用户在系统中的会话过期和最大有效时间。
这两个参数通常与安全性和用户体验的平衡相关。设置得太短可能导致用户频繁需要重新登录,而设置得太长可能增加安全风险。具体的设置应该根据你的应用程序的安全需求和用户行为来确定。
Client Session有效期

"Client Session Idle" 和 "Client Session Max" 是 Keycloak 中用于配置客户端会话的两个参数。这两个参数影响与客户端相关的会话过期和最大有效时间。
这两个参数通常与客户端相关的会话管理和安全性相关。设置得太短可能导致用户频繁需要重新进行身份验证,而设置得太长可能增加安全风险。具体的设置应该根据你的应用程序的安全需求和用户行为来确定。
会话有效期谁小用谁

在 Keycloak 中,会话的有效期确实是由这些参数中的最小值决定的。换句话说,如果设置了 "SSO Session Idle"、"SSO Session Max"、"Client Session Idle" 和 "Client Session Max",则会话将在这些参数中的最小值所界说的时间段内过期。
这种行为是为了确保会话的有效期在所有相关配置中都被严格限制,以提供更加精确的控制。这也意味着无论是团体的单点登录会话有效期还是与特定客户端关联的会话有效期,都将受到最小值的限制。
空闲会话

空闲时间这块,keycloak14.0.0有些bug,这块我进行了源码调整,当session max和session idle不同时,用户在session idle时间内不操作,用户会话也会超时。
在Keycloak中,有四个与空闲会话(Idle Session)相关的设置参数。它们的作用和关系如下:
这些参数共同用于控制空闲会话的超时和最大连续时间。"Offline Session Idle" 和 "Client Offline Session Idle" 确定了用户在没有与Keycloak进行任何交互时,会话被以为是空闲的时间。而 "Offline Session Max Limited" 和 "Offline Session Max" 确定了会话可以连续的最长时间。如果会话超过这个时间段,它将被销毁。
请注意,领域设置中的参数适用于整个领域(realm),而客户端设置中的参数适用于特定的客户端。通过为每个客户端设置不同的值,您可以针对不同的客户端应用程序调整会话时间。
关于会话空闲时间的bug修改

验证token逻辑,解析session idle和session max的逻辑

  1.   public static boolean isSessionValid(RealmModel realm, UserSessionModel userSession) {
  2.   if (userSession == null) {
  3.     logger.debug("No user session");
  4.     return false;
  5.   }
  6.   int currentTime = Time.currentTime();
  7.   // Additional time window is added for the case when session was updated in different DC
  8.   // and the update to current DC was postponed
  9.   int maxIdle = userSession.isRememberMe() && realm.getSsoSessionIdleTimeoutRememberMe() > 0 ?
  10.       realm.getSsoSessionIdleTimeoutRememberMe() : realm.getSsoSessionIdleTimeout();
  11.   int maxLifespan = userSession.isRememberMe() && realm.getSsoSessionMaxLifespanRememberMe() > 0 ?
  12.       realm.getSsoSessionMaxLifespanRememberMe() : realm.getSsoSessionMaxLifespan();
  13.   boolean sessionIdleOk =
  14.       maxIdle > currentTime - userSession.getLastSessionRefresh() - SessionTimeoutHelper.IDLE_TIMEOUT_WINDOW_SECONDS;
  15.   boolean sessionMaxOk = maxLifespan > currentTime - userSession.getStarted();
  16.   return sessionIdleOk && sessionMaxOk;
  17. }
复制代码
session idle和session max的逻辑见效,如果修改refresh_token生成时的校验逻辑

  1. public RefreshResult refreshAccessToken(KeycloakSession session, UriInfo uriInfo, ClientConnection connection,
  2.                                           RealmModel realm, ClientModel authorizedClient,
  3.                                           String encodedRefreshToken, EventBuilder event, HttpHeaders headers,
  4.                                           HttpRequest request) throws OAuthErrorException {
  5.     // TODO: 完善实现了在线校验时,将参数checkExpiration从true改为false,session idle和session max的功能,
  6.     // 但session idle到期后会话会提前注销,不会等session max到期
  7.     RefreshToken refreshToken =
  8.         verifyRefreshToken(session, realm, authorizedClient, request, encodedRefreshToken, false);
  9.     event.user(refreshToken.getSubject()).session(refreshToken.getSessionState())
  10.         .detail(Details.REFRESH_TOKEN_ID, refreshToken.getId())
  11.         .detail(Details.REFRESH_TOKEN_TYPE, refreshToken.getType());
复制代码
session idle(空闲过期时间)和session max(最大过期时间)不相称时,产生的问题

keycloak关于删除过期会话的调理


生成code时,添加session idle的判定


登录超时

对于一种开源框架和产品的学习,我们主要还是实践中去总结它,只有在实践中才能发现它的问题及那些“不为你知”的功能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4