1

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

在 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 调用期间在那里读取,没有任何问题。

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

- 或者 -

有没有办法在 AJAX 请求期间通过某些配置或其他方式使 Session 可用?

- 或者 -

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

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

非常感谢约翰

4

1 回答 1

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 令牌可以与缓存值而不是会话值进行比较。

于 2014-02-21T11:54:28.480 回答