我的ASP.NET MVC应用程序通过使用ValidateAntiForgeryToken属性并调用Html.AntiForgeryToken来写入带有标记值的隐藏输入元素,并将令牌放在cookie中来阻止CSRF攻击。
我的异常日志报告HttpAntiForgeryException的出现,看起来它们是从有效请求触发的(推荐者看起来正确)。导致异常的响应还在表单字段中包含带有标记值的__RequestValidationToken。但是,请求中缺少必要的cookie,导致验证失败并抛出异常。
我正在考虑为什么缺少这个cookie并且出现以下可能的原因:
在解散中,我转向SO的人,并询问我可以调查的这个丢失的cookie的任何其他可能原因。
答案 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);
}