Sobre ViewState, MACValidation y MachineKey en asp .net
En ocasiones necesitamos que nuestras aplicaciones webs dispongan de una parte privada que sea accesible mediante la autenticación de un usuario.
Para ello ASP .Net nos ofrece multitud de componentes para implementar “zonas privadas” de forma rápida y sencilla.
Ya sea usando los Application Services o bien manualmente, el control de la sesión es algo necesario para que esto funcione correctamente.
La forma de implementarlo es sencilla (y no es el motivo de este post) el problema viene cuando intentamos realizar este tipo de validación en entornos compartidos (como es el caso de nuestro hosting en domitienda.com).
Pongamos un ejemplo:
Cuando realizas la validación de usuarios en entorno compartido (WebFarm o Cluster) se autogenera una machineKey como identificador para tu aplicación.
Una segunda aplicación web (alojada en el mismo servidor) realiza una validación de usuario con el mismo sistema y el pool por defecto le autogenera otra machineKey…¿que pasa cuando ambas machineKeys coinciden? Veriamos el siguiente error:
Validation of viewsate 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.
¿Os sis suena? Si es así no os preocupeis… tiene fácil solución.
Podeis usar cualquiera de estas soluciones:
- Deshabilitar ViewState en el Web.Config:
Añade le siguiente código entre los tags <system.web>
<pages enableViewStateMac="false" />
- Deshabilitar ViweState en la propia página:
Añade el siguiente código en la cabecera de la web aspx (entre los tags <% %>)
enableViewStateMac="False"
- Indicar manualmente el MachineKey para tu aplicación:
En lugar de que el pool de asp .net nos genere un machineKey automaticamente podemos indicarle en el web.config que código queremos usar.
Para ello existe una herramienta web que nos generará un machineKey único para nosotros con un formato similar al siguiente:
<machineKey validationKey="2F9A2158572BBDC9DF12E8BB1E19BB12A669406F5F92A3A1972E0BE9ED886CE5D13A10696E5AEB52E46A905122D4889E23109ECFDF231411AAB780A589CC0842" decryptionKey="26464B60C7FB690349D918A6F02D0089A92C1F3AC3749881" validation="SHA1" />
Visita la siguiente web: http://aspnetresources.com/tools/keycreator.aspx y clickea sobre “Generate”.
Con esto solucionamos el problema del ViewState en entornos compartidos.
Y recuerda, si te surge algún otro problema estamos esperandote en el PhpLive de domitienda.com



Victor te cuento que he seguido los pasos que indicaste, pero me sale un nuevo error: “The given key was not present in the dictionary”. Algún idea, me imagino que es a razón de que el machineKey generado no se encuentra an algún diccionario de referecia.
Alguna solución?
¿La machineKey que has puesto la has generado con el enlace del post? ¿o as copiado/pegado el del ejemplo?
Si no te funciona prueba a deshabilitar el viewstate poniendo la siguiente linea en el web.config:
Si utilizamos me iagino que dejará de funcionar el ViewState. Eso implica cambiar el desarrollo, ¿verdad?
Yo si es posible, quiero continuar utilizando el ViewState sin que me aparezca el error. ¿Se puede?
Gracias
Hola Jorge,
si usas la tercera opción (la de añadir manualmente el MachineKey en el Web.Config) podrás trabajar tal y como lo haces ahora pero con tu propia clave de MAC.
Pruebalo y me cuentas
Hola:
He usado la tercera opción añadiendo manualmente el MachineKey pero falla, a los 5 minutos sale de sesión automáticamente debido al error comentado, cuando antes esto no pasaba. De hecho este fallo lo da exclusivamente desde ayer, ya que la aplicación lleva funcionando perfectamente desde hace unos 5 meses y ejecutándola en mi equipo local no da ese problema nunca. ¿Alguna otra idea para solucionar este error?
Un saludo.