我们如何在ServiceStack中删除特定用户的会话?

ozz*_*ozz 4 servicestack

管理员可以禁用或暂停用户的入口.

我们可以在"用户登录"中检查"是否已禁用用户".("为每个请求检查Db"不是一个好选择)

因此,我们希望在管理员禁用其帐户时删除用户的会话.

我们怎样才能实现它?

myt*_*thz 5

如果您知道或已保留,则sessionId可以使用以下命令从缓存中删除会话:

using (var cache = TryResolve<ICacheClient>())
{
    var sessionKey = SessionFeature.GetSessionKey(sessionId);
    cache.Remove(sessionKey);
}
Run Code Online (Sandbox Code Playgroud)

但ServiceStack不会保留所有用户的会话ID本身的映射.避免对每个请求进行数据库查找的一种方法是禁用帐户时保留已禁用的用户ID的记录,稍后您可以在全局请求筛选器中验证该用户ID以确保用户未被锁定.

存储锁定的用户ID的最佳方式是在缓存中,锁定的用户ID的可见性和生命周期在存储会话的同一缓存中.您可以使用自定义缓存键来记录锁定的用户ID,例如:

GlobalRequestFilters.Add((req, res, dto) =>
{
    var session = req.GetSession();
    using (var cache = TryResolve<ICacheClient>())
    {
        if (cache.Get<string>("locked-user:" + session.UserAuthId) != null)
        {
            var sessionKey = SessionFeature.GetSessionKey(session.Id);
            cache.Remove(sessionKey);
            req.Items.Remove(ServiceExtensions.RequestItemsSessionKey);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这将在下次尝试访问ServiceStack时删除锁定的用户会话,强制他们再次登录,此时他们会注意到他们已被锁定.

在这个提交添加了一个新的RemoveSession API,这使得它更好(从v4.0.34 +):

if (cache.Get<string>("locked-user:" + session.UserAuthId) != null)
    req.RemoveSession(session.Id);
Run Code Online (Sandbox Code Playgroud)