【发布时间】: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过期时间的值,可以是绝对值或滑动值。
标签: c# session asp.net-core-2.0 session-cookies