2009-09-01 11 views
19

Po opublikowaniu nowej kompilacji mojej aplikacji sieci web ASP.NET MVC, często widzę ten wyjątek rzucony podczas przeglądania na stronie:ASP.NET MVC Walidacja viewstate MAC udało

System.Web.Mvc.HttpAntiForgeryException: Żeton wymaganego zabezpieczenia przed fałszowaniem nie został dostarczony lub był nieważny. ---> System.Web.HttpException: Sprawdzanie poprawności adresu MAC stanu widoku nie powiodło się. Jeśli ta aplikacja jest hostowana przez farmę sieci Web lub klaster, upewnij się, że konfiguracja określa ten sam klucz sprawdzania poprawności i algorytm sprawdzania poprawności. AutoGenerate nie może być używane w klastrze. ---> System.Web.UI.ViewStateException: Nieprawidłowy stan wyświetlania.

Ten wyjątek będzie nadal występować na każdej stronie odwiedzanej w mojej aplikacji internetowej, dopóki nie zamknę Firefoksa. Po ponownym otwarciu Firefoksa strona działa idealnie. Masz pojęcie, co się dzieje?

Dodatkowe uwagi:

  1. Nie używam żadnych kontroli internetowych ASP.NET (nie istnieją przypadki runat = „serwer” w mojej aplikacji)
  2. Jeśli Wyciągam <% = Html .AntiForgeryToken%> z moich stron, ten problem wydaje się znikać

Odpowiedz

32

Pod pokrywami atrybut MVC AntiForgeryToken używa klucza maszynowego do szyfrowania. Jeśli nie określisz maszynki w web.config (patrz here), zostanie ona automatycznie wygenerowana przez ASP.NET (full description).

Jeśli aplikacja ASP.NET zostanie ponownie uruchomiony (na przykład zrobić iisreset), to AntiForgeryToken w pliku cookie przeglądarki nadal będą szyfrowane z stary klucz maszynowy, więc dlaczego to wywala z powyższego błędu.

W związku z tym należy zawsze określić znacznik maszyny w pliku web.config podczas korzystania z MVC, np.

<configuration> 
    <system.web> 
     <machineKey 
      validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"   
      decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F" 
      validation="SHA1" 
      decryption="AES" 
     /> 
    ... 
+0

nadal jestem uzyskiwanie błąd nawet gdybym wprowadzić MachineKey takiego. Czy to możliwe, że plik machine.config na serwerze (nie mam do tego dostępu) nie jest poprawnie skonfigurowany? – jesperlind

+0

@jesperlind: (Trochę za późno, ale każdemu, kto to czyta, może pomóc ...) Nadal pojawia się błąd, ponieważ przed dodaniem klucza komputera masz plik cookie. Będzie działać tylko bez problemu, jeśli masz klucz komputera zablokowany od początku. – Guffa

+4

Uwaga: Nie używaj dokładnego klucza komputera z powyższego kodu. Jeśli wszystkie witryny mają ten sam klucz komputera, łatwo go ominąć. Użyj generatora maszynowego online do wygenerowania unikalnego klucza, na przykład http://aspnetresources.com/tools/machineKey – Guffa

1

Jeśli jesteś na farmie serwerów, upewnij się, że klucz komputera na każdym serwerze jest taki sam.

0

Ja też miałem ten problem i oczekuję, że użytkownicy wyczyścili pamięć podręczną, pliki cookie lub odświeżili stronę, są nie do przyjęcia.

Dodanie pliku machinekey do pliku web.config naprawi to. Użyłem tego narzędzia, aby szybko wygenerować klucz, więc nie widzę tych błędów w rozwoju, a następnie generuję je poprawnie, gdy strona trafi do produkcji.

http://aspnetresources.com/tools/machineKey

+1

Link jest nieaktualny. – Matty