Artículo original publicado el martes, 15 de septiembre de 2011

Estoy seguro de que muchos de ustedes han visto que mi viejo amigo (vale, una excepción) ha comentado algo así como:  "La validación de seguridad para esta página no es válida.  Haga clic en Atrás en el explorador web, actualice la página e intente la operación de nuevo".  Es como la gelatina del club del mes; es el regalo que se sigue dando.  Este problema surge habitualmente cuando trata de agregar un elemento a una lista.... a menudo en el interior de un delegado de RunWithElevatedPrivileges.  Ahora muchas personas han descubierto algunos problemas y soluciones habituales:

  • Problemas habituales: usando RunWithElevatedPrivileges, pero usando un contexto de SPSite o SPWeb preexistente.  No hay de qué alegrarse porque su contexto de SPSite o SPWeb existente no disfruta de los privilegios de los RunWithElevatedPrivileges invocados posteriormente.
  • Solución habitual: establezca la propiedad AllowUnsafeUpdates en el SPWeb en verdadero, agregue el artículo a la lista y, a continuación, establezca la propiedad de nuevo en falso.  De acuerdo, funciona, pero por lo general me hace sentir como demasiado mimado por la gelatina de julio (¿sabe?.... ¿la gelatina del club del mes?:-)  ¡Choque aquí!).

La solución más bien poco habitual que he encontrado estaba en una situación similar: estaba usando una página personalizada para el directorio _layouts y en el código subyacente estaba agregando un elemento de lista.  Hice que funcionara de la manera rápida y genial en unos 2 minutos porque he visto este problema demasiadas veces antes (como en SharePoint 2003 cuando agregaban el control FormDigest).  Aunque esta vez deseaba profundizar algo más para ver si podía encontrar una alternativa.  En esta ocasión lo hice.

Resulta que puede llamar a SPUtility.ValidateFormDigest() justo antes de iniciar su código de RunWithElevatedPrivileges.  De esa manera se obtiene el código de validación de formulario en la pila y se permite que la adición continúe de manera correcta.  En mi caso concreto, estaba heredando de LayoutsPageBase y mi marcado aspx estaba configurado como cualquier otra página _layouts, en el sentido de que usaba una página maestra que ya contenía un elemento <form> y una instancia de control <FormDigest>.  Si carece de cualquiera de estos en su página o maestro, tendrá que agregarlos también.  El código de AllowUnsafeUpdates ya no es necesario y por tanto, la página completa y el proceso es simplemente mucho más segura.  Eche un vistazo a este enfoque la próxima vez que esté trabajando en un escenario similar.

Esta entrada de blog es una traducción. Puede consultar el artículo original en A New Twist on an Old Friend - "The security validation for this page is invalid" - in SharePoint 2010