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.
Si vous regardez la trace de la pile, j'ai mis à jour la question, cela ne semble pas être entièrement vrai. – Markus
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. –
Salut, Merci pour l'explication. Je ne comprends toujours pas pourquoi quelqu'un voudrait valider le cookie lors du rendu. – Markus