当前位置: 首页 > 知识库问答 >
问题:

Spring Security SAML断言到期,应用程序会话到期

干弘深
2023-03-14

我对SAML断言到期和应用程序会话到期感到困惑。

简单地说,当我们在容器中部署了一个应用程序时,就会创建一个会话。这个会话到期可以通过下面的条目来控制web.xml

<session-config>
    <session-timeout>60</session-timeout>
</session-config>

接下来,当我使用SAML扩展的Spring Security性时,显然同样的会话概念也适用。(如果有必要的话,我正在WildFly 8.2中部署应用程序)

此外,当应用程序会话过期时,注销行为似乎等同于本地注销概念。

到目前为止一切都很好。现在假设SAML断言在2小时内有效,并且用户已经积极工作了2小时。那么后续请求会发生什么?它应该重新登录到IDP吗?但是,这对用户来说不是不方便吗?如果应用程序在断言到期2小时后重定向到IDP再次登录,应该如何处理AJAX请求?

这是指这里的问题

共有1个答案

方航
2023-03-14

Spring SAML为经过身份验证的用户发出一个ExpireingUserNameAuthenticationToken。一旦用于验证用户的SAML断言在其isAuthenticated()时间之后到达其sessionnotor,令牌就会在其isAuthenticated()方法中开始返回false。

可以通过覆盖SAMLAuthenticationProvider并更改方法getExpirationDate(credential)来禁用此行为,该方法返回断言过期的时间,如果断言从未过期,则返回null。然后,应用程序将完全依赖于容器中配置的会话过期。

一旦过期,Spring Security会将当前令牌传递给AuthenticationManager(在securityC中配置ontext.xml

您可以通过添加自己的能够处理ExiringUsernameAuthenticationToken来影响接下来发生的事情。否则系统会因ProviderNotFoundException或其他AuthenticationException(如果您同时使用用户名/密码身份验证)而失败。

异常随后由ExceptionTranslationFilter处理,它通过调用配置的身份验证入口点来启动新的身份验证过程,例如SamlentPoint,它使用默认IDP启动身份验证或显示IDP选择页面。正如您所说,该过程还将基本上执行本地注销。

默认情况下,系统对所有HTTP调用的行为都是相同的-无论是否为AJAX。通过将API和普通URL拆分为单独的<代码>

 类似资料:
  • 问题内容: 我们有一个内部ASP.NET MVC应用程序,需要登录。登录效果很好,并且可以完成预期的工作。会话的有效期为15分钟。在该页面上坐了一段时间后,用户丢失了会话。如果他们尝试刷新当前页面或浏览到另一个页面,他们将获得登录页面。我们会将他们的请求存储起来,以便他们登录后可以继续进入他们请求的页面。这很好。 但是,我的问题是,在某些页面上有AJAX调用。例如,他们可以填写表格的一部分,徘徊并

  • 问题内容: 以下数据库视图将日期截断为会计年度(4月1日): 这使我们能够根据今天的日期计算当前会计年度。 如何简化或优化此计算? 问题答案:

  • 我有一个Android应用程序,可以通过Firebase接收通知。这些通知由网站上的用户操作触发。然后,我们的API向Firebase发送通知请求。 然而,最近我遇到了一个问题,我的应用程序一直不停地接收通知。对于直接通知和主题消息,这似乎都在发生。起初我以为是API卡在某种循环中,但事实并非如此,因为我直接从Firebase控制台发送的通知也会发生这种情况。我自己的理论是Firebase认为通知

  • 问题内容: 我正在JBoss AS 5中运行一个Web应用程序。我还有一个servlet过滤器,它拦截对服务器的所有请求。现在,如果会话已过期,我想将用户重定向到登录页面。我需要在过滤器中执行“ isSessionExpired()”检查,并需要相应地重定向用户。我该怎么做?我在web.xml中设置会话时间限制,如下所示: 问题答案: 你可以使用过滤器并进行以下测试: 上面的代码未经测试。 但是,

  • 问题内容: 我正在创建一个连接到Web服务器的Swing应用程序,并运行一些servlet(由我自己创建)。用户第一次连接时,会获得一个“ playerID”,该“ playerID”将保存在他的servlet会话中。当我尝试从Swing应用程序再次调用servlet时,似乎无法识别“ PlyaerID”。我正在拨打一个简单的电话以获得PlayerID。Servlet识别这种类型的请求,并发送带有

  • 问题内容: 我目前正在建立一个Web应用程序,并且想使用Redis来存储会话。登录时,会话将使用相应的用户ID插入到Redis中,并且到期时间设置为15分钟。我现在想对会话实施反向查找(获取具有特定用户ID的会话)。这里的问题是,由于我无法搜索Redis键空间,因此该如何实现。一种方法是为每个userId设置一个redis,其中包含所有会话ID。但是由于Redis不允许集合中的某个项目过期,并且会