.NET Core 2.x 中的默认会话到期时间是多少?
Posted
技术标签:
【中文标题】.NET Core 2.x 中的默认会话到期时间是多少?【英文标题】:What is the default session expiry in .NET Core 2.x? 【发布时间】:2019-09-20 04:49:30 【问题描述】:在我的启动课程中,我使用这一行启用会话存储:
services.AddDistributedMemoryCache()
.AddSession(options =>
options.IdleTimeout = TimeSpan.FromMinutes(20);
options.Cookie.HttpOnly = true;
)
但是,如果我理解正确,设置IdleTimeout
属性只是表明如果用户超过 20 分钟没有完成任何操作,会话将重新开始。我的应用程序有轮询,它每 5-10 秒使用一次会话存储中的用户信息,所以我认为这不会在这里使用。用户权限和角色可以从当前用户浏览器之外的操作更改,因此我想将会话存储限制为 1 分钟。我似乎找不到任何关于默认到期时间或如何正确设置的确切措辞。
CookieBuilder 类有 Expiration 和 MaxAge 选项,但我不知道哪个是必需的。我也读过Expiration is ignored,这让我对这个主题更加困惑。
更新:当我尝试设置过期时收到此消息:“无法为 SessionOption 定义的 cookie 设置过期”,因此我将 MaxAge 设置为 1 分钟,但我可以看到会话仍然旧超过 1 分钟后的用户数据。
【问题讨论】:
据我了解,只是客户端请求会改变会话的实时时间,服务器端对 Session 的访问不应该影响它(您可以检查一下)。 我不明白如何更改与会话相关的某些权限或角色?您是否在会话中存储角色/权限信息?如果是,它看起来很可疑,因为匿名用户具有不可变/固定的权限,对于注册用户,它们应该存储在持久存储中并在那里更新。 任何用户的每个请求都应通过与会话无关的authentication 和authorization 检查。 用户角色信息存储在数据库中。这些信息很少改变,我试图避免每次调用都访问数据库。存储在用户会话中的只是他/她的角色信息。在向用户显示任何更新或秘密信息之前,会执行实际测试以验证用户的真实角色。我尝试存储的缓存用户设置更多地用于主页上的可见性选项。 @Dinerdo 要显式控制任何缓存数据过期,请直接使用caching API 而不是依赖Session
过期(因为IdleTimeout
与cookie 过期(more info)无关。您例如,Set
一个具有TimeSpan
过期时间的值,可以是绝对值或滑动值。
【参考方案1】:
会话没有像 cookie 那样的“过期”,但默认的 空闲超时 是 20 分钟,并且可以使用 IdleTimeout 选项进行调整。
会话仅在空闲超时期限过后才过期。此外,空闲超时在收到最后一个请求后开始。
对于您的情况,会话将不会过期,因为您每 5 到 10 秒轮询一次(检查会话数据)。此轮询被视为对 .net 核心的“请求”,并重置超时。
您可以通过禁用轮询并创建一个带有检查会话数据的按钮的页面来验证这一点。等待一段时间(例如:20 秒),然后点击按钮。
确保将空闲超时设置为较低的值:
options.IdleTimeout = TimeSpan.FromSeconds(10);
这是Documentation on Session的链接。
【讨论】:
以上是关于.NET Core 2.x 中的默认会话到期时间是多少?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Azure.Storage.Blobs 通过 .NET Core 3.1 生成 SAS 到期令牌
Asp.Net Core Identity 未正确验证令牌到期 [重复]
Asp.net Core 2.0 Identity.TwoFactorRememberMe 到期