En el supuesto de que instales tu aplicación web en una granja de servidores debes tener en cuenta que es posible que la validación del viewstate no se comporte correctamente. Como sabemos para un programador esto es un problema porque son errores que no se producen en nuestro equipo local de desarrollo sino que es en el despliegue.
El error
El error en cuestión es el siguiente:
Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey>….
¿Por qué este error?
Como sabemos en asp.net existe el concepto del viewstate que permite guardar el estado de ciertos controles y partes de la página para ser reutilizados después de un postback. Esto que a priori es una ventaja implica el inconveniente de que un usuario malintencionado envíe una carga _VIEWSTATE y engañe a la aplicación y realice una acción que no se debería realizar.
Para evitar este tipo de ataque el campo _VIEWSTATE se protege codificándolo con un código de autenticación de mensajes (MAC). ASP.Net valida el MAC que se envía con la carga cuando se produce un postback, si no coincide se produce un error en la validación del viewstate.
La clave que se utiliza para calcular el MAC está en el elemento machineKey de la aplicación en el archivo web.config.
Una de las causas más comunes que provocan este error es que nuestra aplicación está en una granja de servidores, en este caso cada uno de los servidores generará una machineKey para nuestra app y entonces ninguno acordará cual aplicar.
Solución
La mejor solución y más sencilla es aplicar una machineKey explícitamente en nuestro web.config. De esta manera cualquier servidor que pretenda ejecutar nuestra aplicación utilizará de manera obligada la clave que le establezcamos en este fichero.
¿Cómo generamos nuestra clave machinekey?
Para generarlo tenemos varias maneras pero yo recomiendo nunca utilizar sitios web donde se generan automáticamente ya que no sabemos si estas claves se han generado de forma segura o son guardadas para posibles usos malintencionados, buff ya sé que suena muy rebuscado pero no nos podemos fiar, solo debemos usar las claves generadas por nosotros mismos.
En este link podemos ver varias maneras para crear el machine.config.
¿En qué sección del web.config editamos nuestra machinekey?
El elemento <machineKey> solo es válido en el archivo Web.config en la raíz de la aplicación y no es válido en el nivel de subcarpeta (location).
<configuration> <system.web> <machineKey ... /> </system.web> </configuration>
el problema se origina en el web.config generado en la creación del proyecto directo al IIS, genere un nuevo proyecto del mismo tipo en [Sistema de Archivos] no [IIS Local], despues de creado tome el contenido del web.config de este nuevo proyecto y coloquelo en el web.config del proyecto que tiene el problema en IIS y listo.
Gracias por tu aportación