2009-02-11 7 views
5

Ich habe gerade auf .NET 3.5 SP1 aktualisiert und meine einmal funktionierende ASP.NET MVC-Seite hat jetzt aufgehört zu arbeiten.Html.AntiForgeryToken() verursacht Fehler nach dem Upgrade auf .NET 3.5 SP1

Beim Versuch, eine Seite, die ich folgendes YSOD

[CryptographicException: Padding is invalid and cannot be removed.] 
    System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast) +7596702 
    System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) +208 
    System.Security.Cryptography.CryptoStream.FlushFinalBlock() +33 
    System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo) +225 
    System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) +195 

[ViewStateException: Invalid viewstate. 
    Client IP: 127.0.0.1 
    Port: 
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR 3.5.30729) 
    ViewState: hC6BC8KsuD/yoy2iG74bUZ8TYhGfuDDeIjh9fg/L18yr/E+1Nk/pjS5gyn9O+2jY 
    Referer: http://localhost:1092/admin/product 
    Path: /admin.aspx/product/edit/4193] 

[HttpException (0x80004005): Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.] 
    System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) +106 
    System.Web.UI.ViewStateException.ThrowMacValidationError(Exception inner, String persistedState) +14 
    System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) +242 
    System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) +4 
    System.Web.Mvc.AntiForgeryTokenSerializer.Deserialize(String serializedToken) +73 

erhalten zu laden, wenn ich die Linie

<%= Html.AntiForgeryToken() %> 

Alles funktioniert wieder entfernen, irgendwelche Ideen, was könnte die Ursache sein? Ich hätte mehr Glück bei der Suche nach einer Lösung erwartet, wenn es sich um ein MVC- oder .NET-Problem handelt, also nehme ich an, dass es etwas mit meiner Konfiguration zu tun hat.

Ich habe versucht, das MVC-Framework neu zu installieren, um zu sehen, ob es war, weil ich vor SP1 installiert habe, aber ich bekomme immer noch das gleiche Problem. Die Google- und SO-Suche hat zu keinen festen Schlussfolgerungen geführt.

Antwort

15

Doh, habe es gerade gelöst.

Habe meinen Browser Cache und Cookies gelöscht und alles funktioniert wieder gut.

+0

Dank! Das hat mir wirklich geholfen, war verrückt geworden. – jesperlind

+0

Sparte mir 2 Stunden Forschung. Danke –

+3

Ebenso. Warum behebt dies das Problem? Und warum gab es überhaupt ein Problem? –

3

Das Löschen des Browsercaches ist keine Option, wenn die Site bereits bereitgestellt ist und Sie Wartungsarbeiten durchführen, einschließlich eines ASP.NET MVC-Assemblyupdates. Hier ist die Lösung, die ich verwendet:

@Html.AntiForgeryTokenReset() @* use this instead*@ 

hier ist die Erweiterung Methode

public static MvcHtmlString AntiForgeryTokenReset(this HtmlHelper htmlHelper) 
{ 
    try 
    { 
     return htmlHelper.AntiForgeryToken(); 
    } catch (Exception ex) 
    { 
     var request = HttpContext.Current.Request; 
     request.Cookies.Clear(); 
     return htmlHelper.AntiForgeryToken(); 
    } 
} 
+0

Interessante Lösung. Ich dachte daran, dies zu verwenden, aber da der Cookie ein Session-Cookie ist, wird er für die Besucher verschwinden, wenn sie den Browser schließen. Da ich sowieso einen Computerschlüssel zu web.config hinzugefügt habe, wird dies kein Problem für zukünftige Updates sein. – Guffa