Una novità per l'errore comune "La convalida di sicurezza della pagina non è valida" in SharePoint 2010
Articolo originale pubblicato giovedì 15 settembre 2011
Sono sicuro che molti di voi hanno sperimentato l'eccezione seguente: "La convalida di sicurezza della pagina non è valida. Fare clic sul pulsante Indietro del browser, aggiornare la pagina, quindi riprovare a eseguire l'operazione." È come una fonte inesauribile. Questo problema in genere si verifica quando provate ad aggiungere un elemento a un elenco, spesso con un delegato RunWithElevatedPrivileges. In molti hanno trovato problemi comuni e ideato soluzioni comuni:
- Problemi comuni: si utilizza RunWithElevatedPrivileges con un contesto SPSite o SPWeb preesistente. Non ci sono buone notizie in questo caso poiché il contesto SPSite o SPWeb esistente non usufruisce dei privilegi di RunWithElevatedPrivileges in quanto è stato richiamato successivamente.
- Soluzione comune: impostate la proprietà AllowUnsafeUpdates nel contesto SPWeb su True, aggiungete l'elemento all'elenco, quindi impostate di nuovo la proprietà su False. Questa soluzione funziona, ma non mi soddisfa appieno.
La soluzione alquanto insolita che ho trovato mi è venuta in mente in una situazione simile, stavo utilizzando una pagina personalizzata per la directory _layouts e nel code-behind stavo aggiungendo un elemento di elenco. Sono riuscito a farla funzionare rapidamente in pochi minuti poiché ho visto questo problema svariate volte, fin dai tempi di SharePoint 2003 quando è stato aggiunto il controllo FormDigest. Questa volta ho voluto tuttavia approfondire maggiormente la situazione per vedere se riuscivo a trovare una soluzione alternativa, e ci sono riuscito.
Ho scoperto che potete chiamare SPUtility.ValidateFormDigest() subito prima di avviare il codice RunWithElevatedPrivileges. In questo modo si inserisce il codice di convalida del modulo nello stack ed è possibile continuare ad aggiungere elementi senza problemi. Nel mio caso specifico stavo ereditando elementi da LayoutsPageBase e il mio markup aspx era configurato come qualsiasi pagina _layouts, in quanto utilizzava una pagina master che conteneva già un elemento <modulo> e un'istanza del controllo <FormDigest>. Se manca uno di questi elementi nella vostra pagina o nella pagina master dovrete aggiungerli. Il codice AllowUnsafeUpdates non è più necessario, pertanto l'intera pagina e il processo sono molto più sicuri. Consultate questo approccio la prossima volta che vi trovate a lavorare in uno scenario simile.
Questo è un post di blog localizzato. L'articolo originale è disponibile in A New Twist on an Old Friend - "The security validation for this page is invalid" - in SharePoint 2010