C# ';会话状态在此上下文中不可用';在IHttpModule AJAX请求中
我知道这是一个有点常见的问题,但我还没有找到一个解决方案,所以,任何和所有的帮助或意见真的感谢 在IHttpModule实现中,我在Init方法中设置了如下处理程序: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
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);
}