从会话状态中删除密钥
Removing key from session state
(请注意,我在 Suave 和一般后端 Web 开发方面的总经验可以用天来衡量,一只手就可以数)
作为我项目的一部分,每当用户成功登录时,都会创建一个唯一的 GUID 并将其存储在会话状态中(使用 SessionID
键)。来自同一用户的后续请求传递相同的 GUID(来自会话状态),从服务器内存中保存的地图中查找它以确认权限。
这部分使用 Suave documentation 中的方法完美运行。澄清一下,我的路由路径使用 statefulForSession
以及文档中定义的 setSessionValue
和 getSessionValue
来设置和读取上面提到的 SessionID
键。
当用户注销或在一段时间内没有任何 activity 时,GUID 将从上面的服务器保存的地图中删除。 是否可以从会话状态中删除密钥 (SessionID
)? 即... 是否可以定义 removeSessionValue
?
鉴于底层 StateStore
对象只公开 set
和 get
,这让我想知道我问的是(有点)荒谬还是有一些我应该使用的其他机制。
从 Suave 源代码中,我知道会话状态(保存在字符串 -> 对象映射中)最终在名为 st
.[=25= 的 cookie 中被序列化和加密]
2021-11-08 更新:
已提交 pull request,其中 StateStore
对象公开了 unset
方法。
您的要求似乎是合理的,但鉴于当前 StateStore
API,我认为没有一种干净的方法可以做到这一点。也就是说,您可以按如下方式破解低级 cookie 状态:
let removeSessionValue (key : string) : WebPart =
context (fun ctx ->
let cookieState =
{
serverKey = ctx.runtime.serverKey
cookieName = StateCookie
userStateKey = StateStoreType
relativeExpiry = Session
secure = false
}
updateCookies cookieState (function
| None ->
Map.empty
|> ctx.runtime.cookieSerialiser.serialise
| Some data ->
try
let m = ctx.runtime.cookieSerialiser.deserialise data
m
|> Map.remove key // this is where we remove the key
|> ctx.runtime.cookieSerialiser.serialise
with ex ->
Map.empty
|> ctx.runtime.cookieSerialiser.serialise))
我从 Suave source code 复制了大部分内容并快速尝试以确保其有效,但我不能保证其正确性。
(请注意,我在 Suave 和一般后端 Web 开发方面的总经验可以用天来衡量,一只手就可以数)
作为我项目的一部分,每当用户成功登录时,都会创建一个唯一的 GUID 并将其存储在会话状态中(使用 SessionID
键)。来自同一用户的后续请求传递相同的 GUID(来自会话状态),从服务器内存中保存的地图中查找它以确认权限。
这部分使用 Suave documentation 中的方法完美运行。澄清一下,我的路由路径使用 statefulForSession
以及文档中定义的 setSessionValue
和 getSessionValue
来设置和读取上面提到的 SessionID
键。
当用户注销或在一段时间内没有任何 activity 时,GUID 将从上面的服务器保存的地图中删除。 是否可以从会话状态中删除密钥 (SessionID
)? 即... 是否可以定义 removeSessionValue
?
鉴于底层 StateStore
对象只公开 set
和 get
,这让我想知道我问的是(有点)荒谬还是有一些我应该使用的其他机制。
从 Suave 源代码中,我知道会话状态(保存在字符串 -> 对象映射中)最终在名为 st
.[=25= 的 cookie 中被序列化和加密]
2021-11-08 更新:
已提交 pull request,其中 StateStore
对象公开了 unset
方法。
您的要求似乎是合理的,但鉴于当前 StateStore
API,我认为没有一种干净的方法可以做到这一点。也就是说,您可以按如下方式破解低级 cookie 状态:
let removeSessionValue (key : string) : WebPart =
context (fun ctx ->
let cookieState =
{
serverKey = ctx.runtime.serverKey
cookieName = StateCookie
userStateKey = StateStoreType
relativeExpiry = Session
secure = false
}
updateCookies cookieState (function
| None ->
Map.empty
|> ctx.runtime.cookieSerialiser.serialise
| Some data ->
try
let m = ctx.runtime.cookieSerialiser.deserialise data
m
|> Map.remove key // this is where we remove the key
|> ctx.runtime.cookieSerialiser.serialise
with ex ->
Map.empty
|> ctx.runtime.cookieSerialiser.serialise))
我从 Suave source code 复制了大部分内容并快速尝试以确保其有效,但我不能保证其正确性。