我正在开发一个 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();
}
您仍然可以尝试将“用户名”存储为键,但将所有“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();
}