';会话状态在此上下文中不可用';在IHttpModule AJAX请求中

本文关键字:IHttpModule AJAX 请求 上下文 会话状态 | 更新日期: 2023-09-27 18:22:09

我知道这是一个常见的问题,但我还没有找到解决方案,所以,非常感谢所有的帮助或评论。

在IHttpModule实现中,在Init方法中,我设置了一个处理程序:

public void Init(HttpApplication context)
{
  context.PreRequestHandlerExecute += new EventHandler(PreRequestHandlerExecute);
}

在PreRequestHandlerExecute方法中,对于任何AJAX调用,我都会得到一个"会话状态在此上下文中不可用"异常。

public void PostRequestHandlerExecute(Object application, EventArgs e)
    {
        HttpApplication app = application as HttpApplication;
        var a = app.Session["csrf_token"];

或者,这样做会导致NullReferenceException

var b = HttpContext.Current.Session["csrf_token"];

我正在尝试访问会话中的一个对象,在非ajax调用期间,该对象被放在那里并在那里读取,没有任何问题。

具体问题是:是否有其他位置可以或应该存储对象而不是会话(除了DB或Cookie)?

--或者--

有没有一种方法可以通过某种配置或其他方式使会话在AJAX请求期间可用?

--或者--

我只是在做一些我不应该在.Net上做的事情吗。我是土生土长的Java人,.Net的概念对我来说是新的。

(尝试在aspx MVP应用程序中实现"同步器令牌模式"以防止CSRF,如果这有帮助的话)

非常感谢John

';会话状态在此上下文中不可用';在IHttpModule AJAX请求中

实际上,CSRF保护的另一个解决方案可能是使用Runtime.cache而不是Session。缓存密钥可以包含唯一标识用户的id,例如用户名。缓存的超时可能应该超过会话或身份验证超时时间,以避免在会话到期之前超时。应该应用缓存,以便访问它可以更新缓存过期时间。即滑动到期而不是绝对到期。http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx

if( HttpRuntime.Cache.Get("dummy") == null )
{
    HttpRuntime.Cache.Add("dummy", "==Username + CSRF TOKEN", null,
                        DateTime.Now.Add(TimeSpan.FromMinutes(30)),                 Cache.NoSlidingExpiration,
                                 CacheItemPriority.Normal,
                                 null);
 } else
 {
     var a = HttpRuntime.Cache.Get("dummy");
     Debug.WriteLine(a);
 }

Runtime.Cache始终可用。这样,在ajax或非ajax请求中接收到的CSRF令牌可以与缓存值而不是会话值进行比较。