mercredi 5 août 2009

Résolution de l'erreur "La validation de la sécurité de cette page n'est pas valide"

Durant mes développements, j'ai quelques fois eu une erreur très gênante. En français, cette erreur ressemble à :

"La validation de la sécurité de cette page n'est pas valide. Cliquez sur Précédente de votre navigateur et retentez l'opération."

En anglais, cela donne :

"The security validation for this page is invalid. Click Back in your Web browser..."

C'est une erreur très frustrante car la plupart du temps, on ne sait pas exactement d'où cela vient. La piste la plus probable que j'ai trouvé ferait intervenir le form digest. En fait, pour effectuer une requête POST modifiant le contenu de la base de données de contenu depuis une page ASPX, il est nécessaire que la page ASPX en question possède un "form digest". En résumé, le "form digest" est un mécanisme de sécurisation de la page générant une message "codé" permettant de prévenir les attaques.

A vrai dire, il est difficile de contourner ce problème avec une méthode bien précise. Jusqu'à présent, je suis tombé sur 3 solutions dont une à l'air de fonctionner sans arrêt. Dans ce cours, nous allons donc aborder ces 3 solutions en terminant par celle qui fonctionne le mieux dans mon cas.

AllowUnsafeUpdate

Il semblerait que cette erreur puisse survenir lors de la mise à jour d'un élément dans une liste SharePoint. Certaines sources sur Internet indiquent qu'il suffit d'encadrer l'appel à la fonction Update de ligne de code permettant les mises à jour non sécurisées. Par exemple, ce code :

using (SPSite site = new SPSite("site")) {

using (SPWeb web = site.OpenWeb()) {

SPList list = web.Lists["list"];

... Récupération d'un élément dans un objet nommé item ...

item.Update();


}


}


Sous certaines conditions, ce code pourrait lancer l'erreur visée par ce cours. Dans ce cas, il semble que faire ceci :


using (SPSite site = new SPSite("site")) {

site.AllowUnsafeUpdates = true;

using (SPWeb web = site.OpenWeb()) {

web.AllowUnsafeUpdates = true;

SPList list = web.Lists["list"];

... Récupération d'un élément dans un objet nommé item ...

item.Update();


}


}


Résolverait le problème. Personnellement, dans mon cas, cette solution n'a jamais rien résolu.

FormDigestSettings

Une deuxième solution que j'ai trouvé en fouillant le net consiste à modifier un paramètre de la Web Application. Personnellement, cela a semblé fonctionner un moment, puis finalement, pas tant que ça, j'ai donc abandonné cette solution. Pour ceux que ca intéresse, il suffirait de mettre ceci avant la ligne de code causant l'erreur :


SPWebApplication webApp = web.Site.WebApplication;
webApp.FormDigestSettings.Enabled = false;

[CODE]

webApp.FormDigestSettings.Enabled = true;


L'idée est donc de désactiver le "form digest" de la Web Application, effectuer les opérations voulues pour ensuite le réactiver. Cette solution n'est pas très conseillée étant donné que l'on modifie un paramètre général d'une Web Application.

SharePoint:FormDigest

Comme nous l'avons vu précédemment, lorsqu'une page tente de faire une requête POST destinée à modifier la base de données de contenu, une vérification est effectuée. Si nous prenons l'exemple d'une page applicative développée à partir de rien, rien n'est prévu pour effectuer cette vérification. Autrement dit, quand SharePoint va tenter de vérifier que la page est sécurisée, l'erreur sera générée. Pour résoudre ce problème, il y a une solution très simple, effectivement, il suffit d'intégrer un contrôle SharePoint:FormDigest pour qu'une fonction Javascript soit générée pour valider la page. Si nous regardons dans le code d'une page contenant ce contrôle, voici ce que nous pourrions voir :


<script> var MSOWebPartPageFormName = 'frmImagePicker';</script>
<script type="text/javascript" language="javascript" src="/_layouts/1033/init.js?rev=ck%2BHdHQ8ABQHif7kr%2Bj7iQ%3D%3D"></script>
<script type="text/javascript" language="javascript" src="/_layouts/1033/init.js?rev=ck%2BHdHQ8ABQHif7kr%2Bj7iQ%3D%3D"></script>
<script type="text/javascript">
//<![CDATA[

function WebForm_OnSubmit() {

UpdateFormDigest('u002f', 1440000);
return true;


}

//]]>

</script>


Comme vous le voyez, cette fonction Javascript permet de mettre à jour une valeur permettant de sécuriser la page en question, ainsi, vous ne devriez plus obtenir l'erreur visée par ce cours.


Plus de tutoriel sur AreaProg et Développez

Aucun commentaire:

Enregistrer un commentaire