IHttpModule AJAX请求中的“会话状态在此上下文中不可用”

时间:2013-07-12 11:56:34

标签: c# asp.net .net mvp csrf

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

在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"];

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

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

- 或 -

有没有办法在AJAX请求期间通过某种配置或某些东西使会话可用?

- 或 -

我只是做一些我不应该在.Net中做的事情。我是Java的本地人,.Net概念对我来说是新的。

(尝试实现'Synchronizer Token Pattern'以防止aspx MVP应用程序中的CSRF,如果有帮助的话)

非常感谢 约翰

1 个答案:

答案 0 :(得分:0)

实际上,另一个用于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令牌与缓存值进行比较,而不是会话值。