lunes, 24 de noviembre de 2008

Problemas con viewsate MAC en entornos compartidos

El otro día me encontré con el siguiente error:

"Validation of viewsate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. Autogenerate cannot be used in a cluster. "

Este problema surge cuando realizas una validación de usuarios en entorno un WebFarm o Cluster y cada aplicación autogenera una machineKey como su identificador. Concretamente esta configuración provoca que si varias aplicaciones web, con validación de usuarios, conviven en el mismo servidor, al realizar una validación de usuario con el mismo sistema, se les va autogenerando la machineKey, y claro, ¿que pasaria cuando se produzca el hecho que las machineKeys coincidan? La respuesta es sencilla, el error de arriba. Así mismo, otro problema colateral con el que me encontré, era el hecho que de repente las variables de sesión se quedaban sin valor.

Después de investigar encontré estas tres soluciones:
  1. Deshabilitar ViewState en el Web.Config añadiendo lo siguiente dentro de :
    <system.web> <pages enableviewstatemac="false">
  2. Deshabilitar ViweState en las páginas añadiendo lo siguiente en la cabecera de los archivos aspx: enableViewStateMac="False".
  3. <%@ Page Language="c#" AutoEventWireup="false" Codebehind="MyPage.aspx.cs" Inherits="MyAssembly.MyPage" enableViewStateMac="False" %>

  4. Evitar que el pool cree el MachineKey para la aplicación, se le asigna uno manualmenteen el web.config. Para este punto la siguiente web los crea: http://aspnetresources.com/tools/keycreator.aspx

<machineKey validation="SHA1" validationKey="F3690E7A3143C185A6A8B4D81FD55DD7A69EEAA3B32A6AE813ECEEC" />

2 comentarios:

HM dijo...

Hola... eso te sirve solo si no tenés nada en sesion... Si tenés que cada servidor de la granja guarda su sesión y tenes NLB para balancear, la solución es configurar el balanceador por afinidad.
Con esto hacés que cada uno de los clientes SIEMPRE vaya al mismo server que lo atendio.

saludos

Jose Luis Montes Martínez dijo...

Hola Horacio,

efectivamente esta solución implica que los usuarios van siempre al mismo servidor, y sí, estamos simplemente balanceando el tráfico entre servidores. Pero el cliente tenía esta configuiración de balanceo, y aplicamos esta opción y no lo que tú planteas, debido a que solo podíamos acceder al aplicativo y no a reconfigurar nada de los servidores.

¡Un saludo!