處理 SharePoint 2010 老問題 (「對於這個網頁的安全性驗證無效」) 的新手法

英文原文已於 2011 年 9 月 15 日星期四發佈

我相信您們當中有很多、很多人都應該見過我的老朋友 (沒錯,就是例外狀況),也就是下列這個訊息:「對於這個網頁的安全性驗證無效。請按一下網頁瀏覽器的 [上一頁],重新整理頁面,然後再次嘗試作業。」這就好比每月精選果醬俱樂部的標語:「這是送也送不完的禮物」。此問題通常在您嘗試新增項目到清單 (通常是 RunWithElevatedPrivileges 委派的內容) 時發生。現在有許多人發現一些常見問題和一般解決辦法:

  • 常見問題 - 使用 RunWithElevatedPrivileges,但使用的是預先存在的 SPSite 或 SPWeb 內容。麻煩的是,您現有的 SPSite 或 SPWeb 內容無法使用後續叫用的 RunWithElevatedPrivileges 權限。
  • 一般解決辦法 - 將 SPWeb 中的 AllowUnsafeUpdates 屬性設為 True、將您的項目新增至清單,然後再將屬性設回 False。沒錯,這個辦法有用,但通常讓我有對 7 月份果醬上癮的感覺 (您知道,這想法來自我的每月精選果醬俱樂部 :-) 且聽我細說分明)。

我在類似的情況下發現另一種較不常用的解決辦法,當時我正在使用 _layouts 目錄的自訂頁面,並且在程式碼後置中新增清單項目。大概 2 分鐘內,這個討厭的問題就出現了,因為這個問題我之前遇過太多次 (就像昔日的 SharePoint 2003 新增 FormDigest 控制項時)。不過,這次我想更深入研究是否能找到替代辦法。這次,我辦到了。

結果顯示,在開始您的 RunWithElevatedPrivileges 程式碼之前,您可以先呼叫 SPUtility.ValidateFormDigest() 權限。如此會在堆疊中取得表單驗證程式碼,並使新增作業可以順利繼續。在我的特殊案例中,項目是繼承自 LayoutsPageBase,而且我的 aspx 標記設定方式與其他 _layouts 頁面一致,亦即使用已包含 <form> 元素和 <FormDigest> 控制項執行個體的主版頁面。如果您的頁面或主版頁面缺少任一項,則必須新增這些項目。由於不再需要 AllowUnsafeUpdates 程式碼,整個頁面與處理程序也更安全。下次您遇到類似的案例時,不妨試試這個方法。

這是翻譯後的部落格文章。英文原文請參閱 A New Twist on an Old Friend - "The security validation for this page is invalid" - in SharePoint 2010