2008-09-23 3 views
11

Ich weiß nicht, ob jemand dieses Problem schon einmal gesehen hat, aber ich bin nur ratlos. Hier ist die unbehandelte Ausnahmebedingungsnachricht, die meine Fehlerseite erfasst.Seltsame unbehandelte Ausnahme von asp.net-Anwendung - Validierung von Viewstate MAC fehlgeschlagen

Fehlermeldung: Validierung von viewstate MAC fehlgeschlagen. Wenn diese Anwendung von einem Webfarm oder -Cluster gehostet wird, stellen Sie sicher, dass die Konfiguration denselben Validierungsschlüssel und denselben Validierungsalgorithmus wie angibt. AutoGenerate kann nicht in einem Cluster verwendet werden.

Stapelüberwachung: bei System.Web.UI.ViewStateException.ThrowError (Exception inneren, String persistedState, String errorPageMessage, Boolean macValidationError) bei System.Web.UI.ObjectStateFormatter.Deserialize (String input) bei System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize (String serializedState) bei System.Web.UI.Util.DeserializeWithAssert (IStateFormatter Formatierer, String serializedState) bei System.Web.UI .HiddenFieldPageStatePersister.Load() um System.Web.UI.Page.LoadPageStateFromPersistenceMedium() bei System.Web.UI.Page.LoadAllState() bei System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) bei -System. Web.UI.Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) bei System.Web.UI.Page.ProcessRequest() bei System.Web.UI.Page.ProcessRequestWithNoAssert (Httpcontext Kontext) bei -System. Web.UI.Page.ProcessRequest (HttpContext Kontext) bei ASP.gene ric_aspx.ProcessRequest (Httpcontext context) bei System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() bei System.Web.HttpApplication.ExecuteStep (IExecutionStep Schritt, Boolean & completedSynchronously)

Quelle: System.Web

Jedes hat eine Idee, wie ich dieses Problem lösen könnte? Vielen Dank.

+0

Nizza bearbeiten Blair. Ich wusste nicht über die Verwendung> –

+0

Ich lösche normalerweise meine Cookies, um loszuwerden, wenn ich diese Nachricht während der Entwicklung bekomme. Ich kann mich nicht erinnern, es auf einer Produktionsstätte gesehen zu haben. –

Antwort

17

Ich erinnere mich, dass dieser Fehler auftreten kann, wenn Sie auf eine Schaltfläche/Link usw. klicken, bevor die Seite vollständig geladen wurde.

Wenn dies der Fall ist, wird der Fehler durch eine ASP.net 2.0-Funktion namens Event Validation verursacht. Dies ist eine Sicherheitsfunktion, die sicherstellt, dass Postback-Aktionen nur von erlaubten und vom Server erstellten Ereignissen kommen, um gefälschte Postbacks zu verhindern. Diese Funktion wird implementiert, indem Steuerelemente gültige Ereignisse registrieren, wenn sie (wie bei ihren tatsächlichen Render() - Methoden) rendern. Das Endergebnis ist, dass Ihr am unteren Rand des Formular-Tag gemacht, Sie so etwas wie dies sehen werden:

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="AEBnx7v.........tS" /> 

Wenn ein Postback auftritt, verwendet ASP.net die in diesem versteckten Feld gespeicherten Werte, um sicherzustellen, dass die Die Schaltfläche, auf die Sie geklickt haben, ruft ein gültiges Ereignis auf.Wenn es nicht gültig ist, erhalten Sie die Ausnahme, die Sie gesehen haben.

Das Problem, das Sie sehen, tritt speziell beim Postback auf, bevor das EventValidation-Feld gerendert wurde. Wenn EventValidation aktiviert ist (was standardmäßig der Fall ist), aber ASP.net das verborgene Feld beim Postback nicht sieht, erhalten Sie auch die Ausnahme. Wenn Sie ein Formular senden, bevor es vollständig gerendert wurde, besteht die Möglichkeit, dass das EventValidation-Feld noch nicht gerendert wurde. Daher kann ASP.net Ihren Klick nicht validieren.

Eine Umgehung ist natürlich, nur Ereignisvalidierung zu deaktivieren, aber Sie müssen sich der Sicherheitsauswirkungen bewusst sein. Alternativ schreiben Sie niemals zurück, bevor das Formular mit dem Rendern fertig ist. Natürlich ist das schwer zu sagen Ihren Benutzern, aber vielleicht könnten Sie die Benutzeroberfläche deaktivieren, bis das Formular gerendert hat?

von http://forums.asp.net/p/955145/1173230.aspx

+0

Also, wenn ich nur alle Steuerelemente deaktivieren, bevor das Render-Ereignis vollständig abgeschlossen ist, sollte dies es richtig lösen? –

+0

Ja, das würde funktionieren, aber deaktivieren Sie insbesondere Kontrollen, die ein Postback verursachen. –

+0

Danke für die Hilfe Chris. –

4

tun Sie mehrere Server laufen diese Anwendung haben und/oder einen Web-Garten haben? Wenn ja, müssen Sie die machine key in der web.config setzen

+0

Schreiben Sie diesen Kommentar, um den Prozess zu beschleunigen. Verwenden Sie einen Online-Generator wie den folgenden http://www.developerfusion.com/tools/generatemachinekey/ und platzieren Sie das generierte MachineKey-Element innerhalb von in Ihrer Konfigurationsdatei web.config. – Entrodus

0

Ich weiß, dass Sie die Validierung von Viewstate MAC deaktivieren können, aber ich denke, wenn die Seite nicht geladen ist, können Sie in mehr Schwierigkeiten geraten. Als ich auf dieses Problem stieß, musste ich alle Tasten deaktivieren, bis die Seite vollständig geladen war.

12

@Chris

, wenn das Problem ein Element klickt, bevor die Seite vollständig gerendert wird, hinzugefügt asp.net 3.5 SP1 einen web.config-Eintrag auf den page element called renderAllHiddenFieldsAtTopOfForm.

+0

Guten Tipp Darren, ich erinnere mich daran, wenn ich schließlich in asp.net 3.5 Code zu codieren: –

+0

Darren, ich schätze Ihre Antwort, aber ich habe eine asp.net 2.0-Anwendung. Es sieht auch so aus, als hätte ich kein asp.net 2.0 sp1, nur 2.0, daher ist der PagesSection-Datentyp leider nicht verfügbar. –

+0

2.0 hat die Seiten Abschnitt, es ist . Es ist unter . Es ist in asp.net 2.0, weil Sie darauf Dinge wie Masterseite und Thema definieren können. –

1

Standardmäßig enthält ASP.NET eine digitale Signatur des ViewState-Werts auf der Seite. Dies geschieht mit einem automatisch generierten Schlüssel, der im Speicher gehalten wird. Dies wird getan, um zu verhindern, dass ein böswilliger Benutzer den ViewState vom Browser aus verändert und sich beispielsweise Zugriff auf Dinge gewährt, auf die er normalerweise keinen Zugriff hätte.

ASP.NET kann optional auch den ViewState verschlüsseln, ist jedoch aus Leistungsgründen standardmäßig deaktiviert. Auf vielen Websites ist es viel wichtiger sicherzustellen, dass der Inhalt von ViewState nicht "mucked" ist, als vertraulich zu behandeln.

Die Fehlermeldung besagt, dass die Signaturprüfung fehlgeschlagen ist. Die Seite wurde mit einem ViewState veröffentlicht, aber die ViewState-Signatur stimmte nicht mit der Signatur überein, die mit den vom Server gehaltenen Schlüsseln berechnet wurde.

Der häufigste Grund für diesen Fehler ist, dass Sie zwei oder mehr Webserver in einer farmähnlichen Umgebung verwenden: Ein Server sendet die ursprüngliche Seite signiert mit dem Schlüssel im Speicher auf diesem Server, aber die Seite wird veröffentlicht zurück zum zweiten (oder dritten ...) Server. Da die zwei oder mehr Server den Signaturschlüssel nicht teilen, stimmen die Signaturen nicht überein.

... Wenn diese Anwendung von einem Web-Farm oder Cluster gehostet wird, stellen Sie sicher, dass die Konfiguration die gleiche validationKey und Validierungsalgorithmus angibt. AutoGenerate kann nicht in einem Cluster verwendet werden.

Was die Fehlermeldung sagt Ihnen ist das validationKey Attribut (see details in MSDN) in Ihrer web.config zu verwenden, um die Signaturschlüssel auf einen Wert von allen Servern gemeinsam genutzt zu codieren, anstatt eine der Verwendung von dynamisch generierten ein. Auf diese Weise kann die Signaturvalidierung unabhängig davon erfolgreich sein, welcher Server das Postback empfängt.

Sie könnte die Überprüfung deaktivieren, aber es ist sehr gefährlich, dies zu tun. Es bedeutet, dass jeder Hacker mit ein wenig Freizeit in Ihrer Anwendung Werte fälschen kann. Wenn Sie beispielsweise den Preis des Artikels in einem ViewState-Wert belassen, kann der Hacker den Wert des Browsers direkt vor der Bestellung in den Wert 0,01 ändern.

+0

Ich freue mich über Ihre Antwort, aber diese App wird nur auf einem einzelnen Server gehostet, nicht in einem Cluster oder einer Webfarm. –

Verwandte Themen