2

我的 ASP.NET MVC 应用程序通过使用 ValidateAntiForgeryToken 属性并调用 Html.AntiForgeryToken 以使用令牌值写入隐藏的输入元素并将令牌放入 cookie 来防止 CSRF 攻击。

我的异常日志报告了 HttpAntiForgeryException 的出现,它们看起来像是由有效请求触发的(引荐来源网址看起来正确)。导致异常的 Response 在 Form 字段中还包含 __RequestValidationToken 以及令牌值。但是,请求中缺少必要的 cookie,导致验证失败并引发异常。

我正在尝试思考为什么缺少此 cookie,并提出了以下可能的原因:

  1. 该域的 Cookie 集合已满。- 如果是这种情况,我希望在每个请求中看到 20/50 个 cookie(顺便说一句,所有用户代理都是 IE7 和 IE8)并且不知何故 cookie 被丢弃了。我在各种异常情况下看到 3 到 23 个 cookie
  2. 已达到 cookie 的数据限制。- 这不会发生。通过查看日志,我可以看到 cookie 集合很小。
  3. 在添加 cookie 之前,将返回响应。- 不确定这个。在头部手动调用 Reponse.Flush 会导致异常,说明在发送响应后无法修改 cookie 集合。
  4. ?

绝望中,我求助于 SO 的人员,并询问我可以调查此丢失 cookie 的任何其他可能原因。

4

2 回答 2

6

我遇到了完全相同的问题。我的内容是通过跨域 iframe 呈现的。根据Adam Young的说法,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\"");
}

我还定义了一个machine key,尽管我不确定这是否必要。

于 2011-04-08T13:32:26.533 回答
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);
}
于 2014-04-24T10:44:40.503 回答