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

时间:2012-10-31 14:09:38

标签: servicestack

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

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

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

我们如何实现它?

1 个答案:

答案 0 :(得分:5)

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

using (var cache = TryResolve<ICacheClient>())
{
    var sessionKey = SessionFeature.GetSessionKey(sessionId);
    cache.Remove(sessionKey);
}

但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);
        }
    }
});

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

新的RemoveSession API为added in this commit,这使得它更好一些(从v4.0.34 +开始):

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