2014-02-28 55 views
0

在我的授权过程中,我需要在会话中设置一些数据,以便它可以随网页提出的每个请求一起移动。只要授权在我的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上放置一个断点,那么我的值就在那里。我想我错过了管道执行的方式。任何信息都会有帮助。

+0

我先在这里想到的是尝试保存一个简单的字符串,而不是一个复杂的对象,并看看是否能工程。如果有,请检查您的对象是否可序列化。 –

回答

1

我能够解决问题并发现几点。它真正涉及到的是管道每个阶段的会话对象的状态。任何时候都不是NULL;问题在于我之前填入的所有值都不能根据我在执行链中的位置得到。我没有找到有关生命周期的任何正式文件,但我还是能发现几件事情:

  • 在AuthProvider,您可以添加到会话收藏价值,但不能读取任何东西它不是以相同的方法添加的。我假设这是因为会议还没有完全水合。会话对象图顶部的会话ID和其他信息等其他信息已完全填充并可用。
  • 在授权属性中,这是相同的处理。您可以添加到会话中,但由于它尚未完全融合,因此无法读取任何内容。我希望在这里检查令牌,但这是不行的。相反,我只是检查用户是否有一个ASP身份验证令牌,它告诉我我还没有杀死他们的会话。够好了。我将在后面的步骤中检查在该会话中加载的令牌。而在未来,当角色加入时,我会在这里尝试处理。
  • 在我的控制器(在我的情况或控制器基地)的OnActionExecuting覆盖,你可以得到完整的会话。虽然,在这里检查令牌是愚蠢的。相反,我认为所有内容都已经被设置,因此我使用它将用户配置文件对象从会话中拉出并存储到一个属性中,以使派生控制器可以访问它。这将在下一个项目符号后执行。
  • ActionFilterAttribute将拥有一个完全水合Session对象为好。所以我创建了一个名为TokenManagementFilterAttribute。在这里,我将我的令牌拉出会话并执行范围检查和验证,并根据需要刷新和更新配置文件对象。如果有任何失败,我设置控制器。响应重定向回登录页面并终止会话。
0

我通常通过重写OnActionExecuting方法来访问基本控制器中的Session变量。我认为初始化在这个过程中为时尚早。请参阅enter link description here

+0

没错,但授权是为了得到这一步的成功。我最终不得不直接做授权逻辑控制器中的 – Sinaesthetic