2010-01-21 44 views
2

我的ASP.NET MVC應用程序通過使用ValidateAntiForgeryToken屬性並調用Html.AntiForgeryToken以令牌值編寫隱藏的輸入元素,並將該令牌放入cookie中來防止CSRF攻擊。RequestVerificationToken cookie在響應中不存在

我的異常日誌報告出現了HttpAntiForgeryException,看起來像是從有效請求(Referrer看起來正確)觸發的。導致該異常的響應還包含帶有令牌值的Form字段中的__RequestValidationToken。但是,Request中缺少必要的Cookie,導致驗證失敗並引發異常。

我試圖想爲什麼這個cookie被丟失,都拿出了以下可能的原因:

  1. Cookies集合充滿了 域。 - 如果是這種情況 在這裏,我希望看到20/50餅乾 在每個請求(BTW所有 用戶代理是IE7和IE8)和 以某種方式c​​ookie被丟棄。 我看到3到23個餅乾 在各種發生的 異常
  2. 餅乾數據限制已達到 達到。 - 這沒有發生。通過 查看日誌,我可以看到 Cookie收集很小。
  3. 在添加cookie之前,響應正在發回 。 - 不知道這個。手動 調用Reponse.Flush的頭 導致一個例外說明 cookies集合不能被修改 repsonse發送後。

在絕望中,我轉向在SO的人,並要求任何其他可能的原因,我可以調查這個缺失的cookie。

+3

我看到完全相同的問題。它只發生在IE中,還有其他的cookie存在。當cookie存在時,我甚至看到了這個錯誤。一段時間以來它一直困擾我,我擔心我將不得不取消我的防僞保護。 – Josh 2011-04-06 20:53:53

+1

有沒有發現這個問題的根源? – Ted 2012-12-15 20:37:47

+0

用戶是否可以在瀏覽器上禁用Cookie? – stepanian 2010-01-21 06:48:37

回答

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,雖然我不確定這是否有必要。

2

根據Josh的回答(iFrame中的crossdomain-issue),我將這段代碼放到了控制器的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); 
} 
相關問題