我使用此procedure将会话状态存储在Azure Redis缓存中。
NuGet RedisSessionStateProvider在Redis中保存会话状态,您可以管理它,因为它是clasiccal inProc Session。
当用户登录时,我会这样做:
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
Session.Add("key", "value");
会话值在应用程序中始终可用。
如果你查看REDIS缓存,你会看到这两个密钥snurztvlyl2jk5wnzstjikln_Internal
snurztvlyl2jk5wnzstjikln_Data
,其中snurztvlyl2jk5wnzstjikln
是SessionID。
当我退出时:
public ActionResult LogOff()
{
Session.Abandon();
AuthenticationManager.SignOut();
return RedirectToAction("Index", "Home");
}
用户SignOut,但如果我查看redis缓存,则值仍然存在。它们不会被删除,只会在会话超时后删除。我也试过Session.Clear()
,Redis缓存中的密钥仍然存在。
为什么不删除密钥或我做错了什么?
更新我创建了一个重现此问题的公共回购 https://github.com/ricardopolo/RedisIssue
答案 0 :(得分:5)
我联系了NuGet RedisSessionStateProvider的创建者,他们向我解释了它的预期行为。
他们说:现在执行Logout调用“Session.Abandon()”。这个操作 实际上从Redis删除会话,然后RedirectToAction(“索引”, “Home”)导致调用“GetItemExclusive”(会话内的方法) 尝试查找会话但未找到会话的状态提供者) 转动调用“CreateUninitializedItem”,创建空会话 SessionStateActions设置为InitializeItem(或1)。所以在这一点上 你在这个会话上做HGETALL,你会看到关键的“SessionStateActions” 而不是“钥匙”。因为这是新创建的空会话而不是 旧的。
这就是ASP.NET MVC的设计方式。您应该看到相同的行为 所有其他供应商也是如此。校验 (http://msdn.microsoft.com/en-us/library/ms178587(v=vs.140).aspx)for 有关会话状态方法及其含义的更多详细信息。
答案 1 :(得分:2)
我有点能够重现它。在Session.Abandon()之后,所有内容都从缓存中删除,然后调用ResetItemTimeout并更新内部密钥(* _Internal)。因此用户在Redis中看到内部密钥。但是在Session.Abandon()之后我没有看到* _Data可用,其中包含实际的会话数据。
我已经解决了与* _Internal相关的这个bug并发布了一个新的nuget包。 (https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.3.0)
如果您仍然看到此新版本的问题,请告诉我们。