如何在redis缓存中保存用户多个会话?

问题描述 投票:0回答:1

我正在开发一个 ASP.NET Core 应用程序,当用户登录系统时,我将用户会话存储在 Redis 缓存中。 “sessionId”作为键,“username”作为值。现在,当用户注销系统时,我从缓存中删除“sessionId”。我收到一项要求,即当用户更改密码时,他们应该从所有设备上注销。

如何从缓存中检索该特定用户的所有会话?

如果我将“username”存储为键,将“sessionId”存储为值,则该值将被新值覆盖。实现它的正确方法是什么?

public async Task<IActionResult> SignIn([FromBody] SignInRequest user)
{
    var sessionId = HttpContext.Session.Id;
    HttpContext.Session.SetString(user.UserName, $"{sessionId}");
    await HttpContext.Session.CommitAsync();

    HttpContext.Session.SetString(user.UserName, $"{sessionId}1");
    await HttpContext.Session.CommitAsync();

    HttpContext.Session.SetString(user.UserName, $"{sessionId}2");
    await HttpContext.Session.CommitAsync();

    var existingSessionData = HttpContext.Session.GetString($"{user.UserName}");

    return Ok();
}
.net asp.net-core .net-core redis stackexchange.redis
1个回答
0
投票

您仍然可以尝试将“用户名”存储为键,但将所有“sessionId”合并为一个字符串作为值。

        public async Task<IActionResult> SignIn([FromBody] SignInRequest user)
        {
            Append(user.UserName, $"{sessionId}");
            Append(user.UserName, $"{sessionId}1");
            Append(user.UserName, $"{sessionId}2");

            var ids=HttpContext.Session.GetString(user.UserName);
            string[] existingSessionData = ids.Trim().Split(" ");   //use trim to delete the first sapce
            return View();
        }

        private async Task Append(string userName,string id)
        {
            var ids=HttpContext.Session.GetString(userName);
            ids = ids + " "+id;                                     //this will also add space when ids is empty
            HttpContext.Session.SetString(userName, ids);
            await HttpContext.Session.CommitAsync();
        }
© www.soinside.com 2019 - 2024. All rights reserved.