';会话状态在此上下文中不可用';在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
实际上,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令牌可以与缓存值而不是会话值进行比较。