老朋友新内容 - SharePoint 2010 中的“此页面的安全验证无效”
原文发布于 2011 年 9 月 15 日(星期四)
我确信你们中的许多人都曾遇到过诸如此类的问题(即异常):“此页面的安全验证无效。请单击 Web 浏览器中的‘后退’,刷新网页,再重试操作。”它就像月度俱乐部的果冻,一种从不断供的礼物。当您尝试向列表中添加某项时,这个问题通常会突然出现...通常是在某个 RunWithElevatedPrivileges 委派内。现在,已经有许多人发现了一些常见问题和常见解决方法:
- 常见问题 - 使用 RunWithElevatedPrivileges,但使用预先存在的 SPSite 或 SPWeb 上下文。这没什么值得高兴的,因为现有 SPSite 或 SPWeb 上下文无法使用随后调用的 RunWithElevatedPrivileges 的特权。
- 常见解决方法 - 将 SPWeb 的 AllowUnsafeUpdates 属性设置为 True,将项目添加到列表,然后将该属性重新设置为 False。没错,这可以解决问题,但这通常让我觉得自己过度沉溺于月度俱乐部的果冻而不能自拔。
在一个类似的情景中,我发现了一个不太常见的解决方法 - 当时我在使用 _layouts 目录中的自定义页面并在代码隐藏中添加列表项。我通过这种快捷但让人讨厌的方式在大约两分钟内就完成操作,因为之前太多次遇到这一问题(就像因为 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 以查看原文