Новый поворот хорошо знакомого сообщения — "Данные проверки безопасности этой страницы недопустимы" — в SharePoint 2010

Исходная статья опубликована в четверг, 15 сентября 2011 г.

Я уверен, очень многие из вас видели хорошо знакомое мне сообщение, которое звучит примерно так: "Данные проверки безопасности этой страницы недопустимы. Нажмите кнопку ''Назад'' браузера, обновите страницу и повторите попытку." Это похоже на "желе месяца" в клубе — подарок, который никогда не иссякает. Эта проблема обычно возникает при попытке добавить элемент в список, часто очень глубоко в делегате RunWithElevatedPrivileges. Многие уже обнаружили некоторые общие проблемы и обходные пути.

  • Общие проблемы — использование RunWithElevatedPrivileges, но с использованием уже существующего контекста SPSite или SPWeb. В этом нет ничего хорошего, поскольку существующий контекст SPSite или SPWeb не использует привилегии вызываемого позже делегата RunWithElevatedPrivileges.
  • Общий обходной путь — присвойте свойству AllowUnsafeUpdates в SPWeb значение true, добавьте элемент в список, затем присвойте этому свойству снова значение false. Этот способ работает, но в целом оставляет такое ощущение, будто я слишком увлекся июльским желе...

Довольно нетипичный обходной путь я нашел сам, оказавшись в аналогичной ситуации, — я использовал настраиваемую страницу для каталога _layouts и в коде программной части добавлял элемент списка. Я заставил это работать быстрым и противным способом примерно за 2 минуты, поскольку много раз видел эту проблему ранее (начиная с SharePoint 2003, когда был добавлен элемент управления FormDigest). На этот раз я решил углубиться немного дальше, чтобы узнать, смогу ли я найти альтернативу. И на этот раз я смог.

Как оказалось, можно вызвать SPUtility.ValidateFormDigest() непосредственно перед запуском кода RunWithElevatedPrivileges. При таком подходе код проверки формы "застревает" в стеке и операция добавления выполняется успешно. В моем частном случае я наследовал от InLayoutsPageBase, и разметка ASPX была настроена, как любая другая страница _layouts (т. е. использовалась главная страница, которая уже содержала элемент <form> и экземпляр элемента управления <FormDigest>). Если у вас отсутствует какой-либо из этих элементов на вашей или главной странице, его придется добавить. Код AllowUnsafeUpdates больше не нужен, и таким образом вся страница и процесс становятся намного более безопасными. Попробуйте такой подход в следующий раз, когда возникнет аналогичная ситуация.

Это локализованная запись блога. Исходная статья находится по ссылке A New Twist on an Old Friend - "The security validation for this page is invalid" - in SharePoint 2010