Request中不存在RequestVerificationToken cookie

时间:2010-01-21 06:42:49

标签: asp.net-mvc csrf antiforgerytoken missing-cookies

我的ASP.NET MVC应用程序通过使用ValidateAntiForgeryToken属性并调用Html.AntiForgeryToken来写入带有标记值的隐藏输入元素,并将令牌放在cookie中来阻止CSRF攻击。

我的异常日志报告HttpAntiForgeryException的出现,看起来它们是从有效请求触发的(推荐者看起来正确)。导致异常的响应还在表单字段中包含带有标记值的__RequestValidationToken。但是,请求中缺少必要的cookie,导致验证失败并抛出异常。

我正在考虑为什么缺少这个cookie并且出现以下可能的原因:

  1. Cookie收集已满 域。 - 如果是这样的话 在这里,我希望看到20/50的饼干 在每个请求(BTW所有 用户代理是IE7和IE8)和 不知何故,cookie被丢弃了。 我看到3到23个饼干 在各种各样的情况下 例外
  2. Cookie的数据限制 到达。 - 这没有发生。通过 看着日志,我可以看到 cookie集合很小。
  3. 正在回复回复 在添加cookie之前。 - 不确定这个。手动 在头部调用Reponse.Flush 导致异常声明 cookies集合无法修改 在repsonse被发送之后。
  4. 在解散中,我转向SO的人,并询问我可以调查的这个丢失的cookie的任何其他可能原因。

2 个答案:

答案 0 :(得分:6)

我遇到了完全相同的问题。我的内容是通过跨域iframe呈现的。根据{{​​3}},IE将自动阻止第三方cookie,除非您在标题中定义了P3P策略。

我添加了代码以将p3p策略注入标头,并从我在iframe中使用的每个操作中调用它。到目前为止,我们还没有看到这个错误出现。我希望这个解决方案可以帮助别人。

public static void SetP3PCompactPolicy()
{
    HttpContext.Current.Response.AddHeader("p3p", 
    "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
}

我还定义了一个Adam Young,虽然我不确定这是否必要。

答案 1 :(得分:2)

根据Josh的回答(iFrame中的跨域问题),我将这段代码放入我的控制器的BeginExecute方法中,以实现每次调用所需的行为。除了基本控制器之外,每个其他控制器都来自,您可以实现,如果您的网站嵌入在iFrame中,您的所有操作都将运行。

protected override IAsyncResult BeginExecute(System.Web.Routing.RequestContext requestContext, AsyncCallback callback, object state)
{
    requestContext.HttpContext.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

    return base.BeginExecute(requestContext, callback, state);
}