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

C# ';会话状态在此上下文中不可用';在IHttpModule AJAX请求中,c#,asp.net,.net,mvp,csrf,C#,Asp.net,.net,Mvp,Csrf,我知道这是一个有点常见的问题,但我还没有找到一个解决方案,所以,任何和所有的帮助或意见真的感谢 在IHttpModule实现中,我在Init方法中设置了如下处理程序: public void Init(HttpApplication context) { context.PreRequestHandlerExecute += new EventHandler(PreRequestHandlerExecute); } 在PreRequestHandlerExecute方法中,对于任何AJAX

我知道这是一个有点常见的问题,但我还没有找到一个解决方案,所以,任何和所有的帮助或意见真的感谢

在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

实际上,另一种用于CSRF保护的解决方案是使用Runtime.cache而不是会话。缓存密钥可以包含唯一标识用户的id,例如用户名。缓存的超时可能会超过会话或身份验证超时时间,以避免在会话过期之前超时。应该应用缓存,以便访问它可以延长缓存过期时间。即滑动到期,而非绝对到期

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

可能的重复可能会有帮助:@Andrei this resource:是我解决问题的资源,它比SO答案更清晰。我认为你的链接来自于此。非常感谢。
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);
 }