会话数据在请求之间不存在?

时间:2014-02-28 18:03:47

标签: .net asp.net-mvc-4 session-variables

在我的授权过程中,我需要将一些数据设置到会话中,以便它可以随网页发出的每个请求一起传送。一旦授权在我的AuthorizationAttribute.AuthorizeCore()中得到批准,我就会调用我们的服务来检索需要随每个请求一起传输的必要数据,并通过httpContext.Session["MyInfoObject"] = myInfoObject将其填充到会话中,然后返回true 。

会话cookie已设置,下一个请求显示用户现在已通过身份验证。但是,当我尝试检索先前通过var myInfoObject = requestContext.HttpContext.Session["MyInfoObject"] as MyInfoObject;存储的数据时,整个会话值集合为空。我观察到Session对象,我可以看到Session对象已填充,SessionID与浏览器中会话cookie中的SessionID相同,但值集合为空。什么都没有保存。

有什么想法吗?

更新 我正在检查控制器基类中的会话值。我为我的控制器创建了一个自定义基类,在Initialize()重写中,我首先调用base.Initialize()然后开始摆弄Session。在此阶段,会话值为空。但是,如果我在Derived控制器上的Action中放置一个断点,那么我的值就在那里。我想我错过了管道执行方式。任何信息都会有所帮助。

2 个答案:

答案 0 :(得分:1)

我能够解决这个问题,并发现了几点。它真正归结为管道的每个阶段的会话对象的状态。它在任何时候都不是NULL;问题在于我之前填入的所有值都不可用,这取决于我在执行链中的位置。我没有找到任何关于生命周期的官方文档,但我能够发现一些事情:

  • 在AuthProvider中,您可以添加到会话值集合,但是您无法从中读取未在同一方法中添加的任何内容。我假设它是因为会话还没有完全补充水分。其他内容如会话ID和会话对象图顶部的其他信息已完全填写并可用。
  • 在Authorization属性中,它是相同的交易。您可以添加到会话中,但是您无法读取任何内容,因为它还没有完全补充水分。我本来希望在这里检查令牌,但那是不行的。所以相反,我只是检查用户是否有一个ASP身份验证令牌,它只是告诉我我还没有杀死他们的会话。够好了。我将在稍后的步骤中检查该会话中加载的令牌。并且在将来,当添加角色时,我将尝试在此处理。
  • 在我的控制器(或我的控制器库)的OnActionExecuting覆盖中,您可以获得完整的会话。虽然,在这里检查令牌是愚蠢的。相反,我假设此时已经设置了所有内容,因此我使用它将用户配置文件对象拉出会话并将其存储到属性中,使派生控制器可以访问它。这将在下一个项目符号后执行。
  • ActionFilterAttribute也将具有完全水合的Session对象。所以我创建了一个名为TokenManagementFilterAttribute的东西。在这里,我将我的标记拉出会话并进行范围检查和验证,并根据需要刷新和更新配置文件对象。如果有任何失败,我设置controller.Response重定向回登录页面并终止会话。

答案 1 :(得分:0)

我通常通过重写OnActionExecuting方法来访问基本控制器中的Session变量。我认为初始化过程太早。见enter link description here

相关问题