ASP.NET su un Network Load Balancing: problemi con il ViewState



Una applicazione Asp.NET sviluppata inizialmente su un server singolo o su un cluster in Fault Tollerance, una volta passata su un ipotetico environment di produzione basato su un cluster Network Load Balancing, se non ben configurata puo' restituire il seguente errore dopo un postback:

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.

Il motivo e' semplice da spiegare: il ViewState presente nella pagina (in pratica un campo 'hidden' inserito nel form della pagina, utilizzato dal framework per archiviare informazioni tra un postback e l'altro) viene criptato dal webserver, in modo da rendere non leggibili eventuali informazioni sensibili in esso contenute.

Nella configurazione di default, senza modifiche al Web.Config, la chiave utilizzata per la cifratura viene generata dinamicamente: in un ambiente Load Balancing (nel quale le richieste possono essere instradate indifferentemente su uno qualsiasi dei webserver presenti nel cluster) puo' verificarsi che una pagina generata da un server (e quindi con una chiave di cifratura legata a quella macchina) effettui il postback su un'altro webserver che, trovando una 'machinekey' diversa dalla propria restuisce l'errore riportato sopra.

La soluzione e' rapida e indolore: forzare nel web.config una chiave di cifratura (la cosidetta 'MachineKey') comune per tutti i nodi del cluster NBL.

La sintassi e' la seguente (per i dettagli vi rimando alla pagina presente su MSDN):

[sourcecode language='xml']
decryptionKey="AutoGenerate,IsolateApps" [String]
validation="SHA1" [SHA1 | MD5 | 3DES | AES]
decryption="Auto" [Auto | DES | 3DES | AES]
/>
[/sourcecode]
La generazione della MachineKey puo' essere effettuata in maniera semplice e rapida da questo tool online.

Published: March 03 2008

  • category: