Solución para error de validación ViewState Mac en ASP.NET
¿Qué es View state? El estado de visualizacióno View state, son los códigos que interactúan entre los formlarios web .aspx y la aplicación que lo contiene. El inicio en HTML del Viewstate es algo similar a: <input type=»hidden» name=»__VIEWSTATE» id=»__VIEWSTATE» value=»…» />
El estado de la aplicación y mucha información de relevancia es guardada en el Viewstate cuando vamos hacer un Postback al formulario web. De ahí la importancia que tiene poder encriptarlo y desencriptarlo cada vez que se ejecuta. Es una medida de seguridad crucial.
Muchas veces podemos tener errores del tipo “Validation of viewstate 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”
Esto ocurre esencialmente cuando la sincronización de las claves de seguridad entre el formulario, el web.config y la propia aplicación no se han sincronizado de forma correcta; los escenarios más habituales es cuando hay redundancia de clústers entonces un servidor B no sabe la clave del servidor A (lo que es lógico y normal), de ahí que tenemos que buscar algunas formas para evitar este tipo de error.
Existen varias formas de solucionar este error, y se pueden observar en MSDN support.microsoft .com/en-us/kb/2915218, múltiples formas de solución, pero aquí vamos a ver una que es muy efectiva y relativamente de fácil aplicación.
Procedimiento para crear una clave <machineKey> explicita:
- Crear un archivo llamado Generate-MachineKey.ps1 y agregar la siguiente información al mismo:
# Generates a element that can be copied + pasted into a Web.config file.
function Generate-MachineKey {
[CmdletBinding()]
param (
[ValidateSet(«AES», «DES», «3DES»)]
[string]$decryptionAlgorithm = ‘AES’,
[ValidateSet(«MD5», «SHA1», «HMACSHA256», «HMACSHA384», «HMACSHA512»)]
[string]$validationAlgorithm = ‘HMACSHA256’
)
process {
function BinaryToHex {
[CmdLetBinding()]
param($bytes)
process {
$builder = new-object System.Text.StringBuilder
foreach ($b in $bytes) {
$builder = $builder.AppendFormat([System.Globalization.CultureInfo]::InvariantCulture, «{0:X2}», $b)
}
$builder
}
}
switch ($decryptionAlgorithm) {
«AES» { $decryptionObject = new-object System.Security.Cryptography.AesCryptoServiceProvider }
«DES» { $decryptionObject = new-object System.Security.Cryptography.DESCryptoServiceProvider }
«3DES» { $decryptionObject = new-object System.Security.Cryptography.TripleDESCryptoServiceProvider }
}
$decryptionObject.GenerateKey()
$decryptionKey = BinaryToHex($decryptionObject.Key)
$decryptionObject.Dispose()
switch ($validationAlgorithm) {
«MD5» { $validationObject = new-object System.Security.Cryptography.HMACMD5 }
«SHA1» { $validationObject = new-object System.Security.Cryptography.HMACSHA1 }
«HMACSHA256» { $validationObject = new-object System.Security.Cryptography.HMACSHA256 }
«HMACSHA385» { $validationObject = new-object System.Security.Cryptography.HMACSHA384 }
«HMACSHA512» { $validationObject = new-object System.Security.Cryptography.HMACSHA512 }
}
$validationKey = BinaryToHex($validationObject.Key)
$validationObject.Dispose()
[string]::Format([System.Globalization.CultureInfo]::InvariantCulture,
«»,
$decryptionAlgorithm.ToUpperInvariant(), $decryptionKey,
$validationAlgorithm.ToUpperInvariant(), $validationKey)
}
}
O Descargar Generate-MachineKey desde aquí.
- Ejecutar el script de PowerShell por ejemplo como PS E:\> . .\ Generate-MachineKey.ps1
- Lo de arriba cargo el script en memoria, ahora podemos ejecutar:
- PS E:\> Generate-MachineKey -validationAlgorithm SHA1
- Vamos a obtener todo un código que debemos copiarlos a nuestro archivo web.config entre las líneas <system.web> </system.web>
- </configuration>
- <machineKey … />
- <configuration>
Ahora reiniciamos IIS, o el grupo de aplicaciones y no deberíamos tener más problemas con la validación MAC del Viewstate.
Deja una respuesta