2009-09-01 24 views
19

Después de publicar una nueva versión de mi aplicación web ASP.NET MVC, a menudo veo esta excepción lanzada al navegar en el sitio:ASP.NET MVC Validación de ViewState MAC no

System.Web.Mvc.HttpAntiForgeryException: No se proporcionó un token antifalsificación requerido o no fue válido. ---> System.Web.HttpException: la validación de viewstate MAC falló. Si esta aplicación está alojada en una Web Farm o clúster, asegúrese de que la configuración especifique la misma validationKey y el mismo algoritmo de validación. AutoGenerate no se puede usar en un clúster. ---> System.Web.UI.ViewStateException: viewstate no válido.

Esta excepción continuará ocurriendo en cada página que visito en mi aplicación web hasta que me cierre de Firefox. Después de reabrir Firefox, el sitio funciona perfectamente. ¿Tienes idea de lo que está pasando?

Notas adicionales:

  1. No estoy usando cualquier control ASP.NET Web (no hay casos de runat = "server" en mi solicitud)
  2. Si saco la <% = Html .AntiForgeryToken%> de mis páginas, este problema parece desaparecer

Respuesta

32

Debajo de las cubiertas, el atributo MVC AntiForgeryToken utiliza la clave de máquina para el cifrado. Si no especifica una clave de máquina en web.config (consulte here), ASP.NET generará una automáticamente para usted (full description).

Si se reinicia la aplicación ASP.NET (por ejemplo, hacer un iisreset ), el AntiForgeryToken dentro del cookie del navegador todavía será encriptada con una clave de vieja máquina, de ahí que se bloquea con el error anterior.

Por lo tanto, siempre debe especificar una clave de máquina en su web.config cuando use MVC, p.

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

todavía estoy recibiendo el error incluso si entro en la machineKey como este. ¿Podría ser que el machine.config en el servidor (no tengo acceso a esto) no está configurado correctamente? – jesperlind

+0

@jesperlind: (Un poco tarde, pero cualquiera que lea esto podría ser ayudado ...) Aún obtiene el error porque tiene una cookie de antes de agregar la clave del equipo. Solo funcionará sin problemas si tiene la llave de la máquina bloqueada desde el principio. – Guffa

+4

Nota: No use la clave de máquina exacta del código anterior. Si todos los sitios tienen la misma clave de máquina, es fácil de eludir. Utilice un generador de claves en línea para generar una clave única, por ejemplo http://aspnetresources.com/tools/machineKey – Guffa

1

Si está en una granja de servidores, asegúrese de que la clave de su máquina en cada servidor sea la misma.

0

también tuve este problema, y ​​esperando a los usuarios borrar la caché, cookies o actualizar la página no es aceptable.

Agregar una clave de máquina a web.config lo arreglará. Usé esta herramienta para generar rápidamente una clave, así que no veo estos errores en desarrollo y luego genero uno correctamente cuando el sitio entra en producción.

http://aspnetresources.com/tools/machineKey

+1

El enlace está desactualizado. – Matty

Cuestiones relacionadas