我的ASP.NET MVC应用程序通过使用ValidateAntiForgeryToken属性并调用Html.AntiForgeryToken来写入带有标记值的隐藏输入元素来阻止CSRF攻击,并将标记放在cookie中.
我的异常日志是报告HttpAntiForgeryException的出现,看起来它们是从有效请求触发的(推荐者看起来正确).导致异常的响应还在表单字段中包含带有标记值的__RequestValidationToken.但是,请求中缺少必要的cookie,导致验证失败并抛出异常.
我想到为什么这个cookie丢失了,并提出了以下可能的原因:
域名的Cookie集合已满. - 如果是这种情况,我希望在每个请求中看到20/50个cookie(BTW所有用户代理都是IE7和IE8)并且不知何故cookie被丢弃.我在异常的各种情况下看到3到23个饼干
已达到Cookie的数据限制. - 这没有发生.通过查看日志,我可以看到cookie集合很小.
在添加cookie之前,将回复响应. - 不确定这个.手动调用头部中的Reponse.Flush会导致异常,说明在发送repsonse后无法修改cookie集合.
?
在解散中,我转向SO的人,并询问我可以调查的这个丢失的cookie的任何其他可能原因.
我遇到了完全相同的问题.我的内容是通过跨域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\""); }
我还定义了一个机器密钥,虽然我不确定是否有必要.