从会话状态中删除密钥

Removing key from session state

(请注意,我在 Suave 和一般后端 ​​Web 开发方面的总经验可以用天来衡量,一只手就可以数)

作为我项目的一部分,每当用户成功登录时,都会创建一个唯一的 GUID 并将其存储在会话状态中(使用 SessionID 键)。来自同一用户的后续请求传递相同的 GUID(来自会话状态),从服务器内存中保存的地图中查找它以确认权限。

这部分使用 Suave documentation 中的方法完美运行。澄清一下,我的路由路径使用 statefulForSession 以及文档中定义的 setSessionValuegetSessionValue 来设置和读取上面提到的 SessionID 键。

当用户注销或在一段时间内没有任何 activity 时,GUID 将从上面的服务器保存的地图中删除。 是否可以从会话状态中删除密钥 (SessionID)? 即... 是否可以定义 removeSessionValue ?

鉴于底层 StateStore 对象只公开 setget,这让我想知道我问的是(有点)荒谬还是有一些我应该使用的其他机制。

从 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 复制了大部分内容并快速尝试以确保其有效,但我不能保证其正确性。