2010-11-15 14 views
1

J'ai la redoutée validation du problème viewstate MAC échoué de temps en temps. Je cours mon application dans une ferme de Web et ai placé la clef de machine de l'application à la même valeur sur tous les serveurs de Web. J'ai fait quelques expériences et maintenant j'ai deux questions concernant le mécanisme de jeton anti-falsification:

1. Je semble obtenir cette erreur même si je n'appelle aucune action avec l'attribut [ValidateAntiForgeryToken] (le problème semble apparaître lors du rendu du jeton dans la vue). Pourquoi cela arrive-t-il? La validation n'est-elle pas censée s'exécuter uniquement lorsque l'attribut est présent. Le problème disparaît si le cookie __RequestVerificationToken est supprimé.

2. Le cookie __RequestVerificationToken n'est-il pas supposé être un cookie de session et donc invalide à l'expiration de la session? Cela ne semble pas être le cas?MVC Anti-falsification de jeton validant même si aucun [ValidateAntiForgeryToken]

Trace de la pile:

Un jeton anti-contrefaçon requise n'a pas été livré ou est invalide

à System.Web.Mvc.AntiForgeryDataSerializer.Deserialize (String serializedToken)
au système. Web.Mvc.HtmlHelper.GetAntiForgeryTokenAndSetCookie (String salt, String domain, Chemin de chaîne)
at System.Web.Mvc.HtmlHelper.AntiForgeryToken (String salt, String domain, Chemin de chaîne)
at System.Web. Mvc.HtmlHelper.AntiForgeryToken()
à ASP.views_customer__customerlogin_ascx._ Render _control1 (HtmlTextWriter __W, contrôle parameterContainer)
à System.Web.UI.Control.RenderChildrenInternal (écrivain HtmlTextWriter, les enfants ICollection)
au système. Web.UI.Control.RenderChildrenInternal (écrivain HtmlTextWriter, les enfants ICollection)
à System.Web.UI.Page.Render (écrivain HtmlTextWriter)
à System.Web.Mvc.ViewPage.Render (écrivain HtmlTextWriter)
au système .Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
à System.Web.UI.Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
à System.Web.UI.Page.ProcessRequest() à System.Web.UI.Page.ProcessRequest (HttpContext contexte)
au système .Web.Mvc.ViewUserControl.ViewUserControlContainerPage.ProcessRequest (HttpContext contexte)
à System.Web.Mvc.ViewPage.RenderView (viewContext viewcontext)
à System.Web.Mvc.ViewUserControl.RenderViewAndRestoreContentType (ViewPage containerPage, viewContext viewcontext)
à System.Web.Mvc.HtmlHelper.RenderPartialInternal (String partialViewName, ViewDataDictionary viewData, Modèle d'objet, TextWriter writer, ViewEngineCollection viewEngineCollection)
à System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial (HtmlHelper HtmlHelper, String partialViewName, le modèle de l'objet) à ASP.views_cart_index_aspx .__ Rendercontainer_main (HtmlTextWriter __W, Contrôle parameterContainer)
à System.Web.UI.Control.RenderChildrenInternal (HtmlTextWriter écrivain, enfants ICollection) à ASP.views_shared_site_master._ Render _control1 (HtmlTextWriter __W, contrôle parameterContainer) à System.Web.UI.Control.RenderChildrenInternal (écrivain HtmlTextWriter, les enfants ICollection)
à System.Web.UI.Control. RenderChildrenInternal (writer HtmlTextWriter, enfants ICollection) sur System.Web.UI.Page.Render (HtmlTextWriter writer)
à System.Web.Mvc.ViewPage.Render (HtmlTextWriter writer) à System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) à System.Web.UI.Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) à System.Web.UI.Page.ProcessRequest() à System.Web.UI.Page.ProcessRequest (contexte HttpContext)
à System.Web.Mvc.ViewPage.ProcessRequest (contexte HttpContext) à ASP.views_cart_index_aspx.ProcessRequest (contexte HttpContext)
à System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper. <> c_ DisplayClass1.b _0() à System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper. <> c_ DisplayClass4.b _3()
à System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap [TResult] (Func`1 func)
à System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap (Action l'action)
à System.Web.HttpServerUtility.ExecuteInternal (gestionnaire IHttpHandler, écrivain TextWriter, Boolean preserveForm, Boolean setPreviousPage, piste VirtualPath, VirtualPath filePath, String physPath, erreur d'exception, String queryStringOverride)

exception intérieure

Val l'idation de viewstate MAC a échoué. Si cette application est hébergée par une batterie ou un cluster Web, assurez-vous que la configuration spécifie le même algorithme de validation et de validation. AutoGenerate ne peut pas être utilisé dans un cluster.

Répondre

1
  1. Seules les actions décorées avec l'attribut [ValidateAntiForgeryToken] vérifier le jeton et peut soulever cette exception. Cookie n'a aucune relation avec une session et ne expire jamais. La vérification consiste à vérifier l'égalité de la valeur du cookie avec la valeur POSTed du champ caché.
+0

Si vous regardez la trace de la pile, j'ai mis à jour la question, cela ne semble pas être entièrement vrai. – Markus

+0

Oui, en effet, l'assistant HTML 'AntiForgeryToken' vérifie la présence du cookie et essaie de désérialiser sa valeur. C'est ici que l'exception se produit. Il semble que le cookie a été chiffré avec une clé machine différente de la clé machine utilisée pour le déchiffrer. –

+0

Salut, Merci pour l'explication. Je ne comprends toujours pas pourquoi quelqu'un voudrait valider le cookie lors du rendu. – Markus