ASP.NET会话cookie,CSRF令牌和Ajax调用的异常行为

时间:2018-12-19 20:23:41

标签: c# jquery asp.net ajax cookies

在验证CSRF令牌时,我们遇到了一种奇怪的情况。这是事件序列,其标记由字母代替:

  1. 用户注销。重定向到主页。

    Session.Abandon(); FormsAuthentication.SignOut();

  2. 使用新的会话ID(S1)和新的CSRF令牌(T1)创建新的会话。

    protected void Session_Start(object sender, EventArgs e) { Response.Cookies["ASP.NET_SessionId"].Secure = true; Token = NewToken(); }

  3. 主页加载并触发一个JS Ajax请求,该请求带有令牌(T1)进行验证。从检查中我们知道,由于某种原因,此请求在应具有会话ID(S1)时会带有空白 ASP.NET_SessionId cookie(ASP.NET_SessionId=;)。因此,它被视为后端上的新会话,并且对此请求重复步骤2。后端现在具有新的会话ID(S2)和新的令牌(T2)。

  4. 后端继续处理Ajax请求。它将令牌(T1)与令牌(T2)进行比较,但失败。
  5. 刷新页面或导航到另一个页面后,在站点上进行的后续调用均成功而没有问题。 Ajax请求带有ASP.NET_SessionId cookie,并且一切正常。它们在会话ID(S1)和令牌(T1)下执行。

我们已设法部分地跟踪到将ASP.NET_SessionId cookie设置为HTTP Only的问题:

Response.Cookies["ASP.NET_SessionId"].Secure = true;

如果我们删除它,它将对注销后的第一个请求以及后续请求均起作用。 ASP.NET_SessionId cookie在所有Ajax调用中发送。

我们[显然]希望保持cookie的安全,因此不能删除Secure = true

为什么注销后在首页上加载Ajax请求传递ASP.NET_SessionId cookie的值,但随后的请求呢?就像ASP.NET_SessionId cookie尚未准备就绪,或者在加载后的初始请求中JS中没有可用,但是可以在后续请求(导航/重新加载)中读取。

0 个答案:

没有答案