Asp.net la Validation de viewstate MAC a échoué
j'obtiens l'erreur suivante, à certains moments, asp.net site web.
Sys.WebForms.PageRequestManagerServerErrorException:
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.
Lors de l'actualisation de la page va,pas de problème.Comment puis-je résoudre ce problème?
12 réponses
si vous utilisez une ferme web et que vous exécutez la même application sur plusieurs ordinateurs, vous devez définir explicitement la touche machine dans la machine.fichier de configuration:
<machineKey validationKey="JFDSGOIEURTJKTREKOIRUWTKLRJTKUROIUFLKSIOSUGOIFDS..." decryptionKey="KAJDFOIAUOILKER534095U43098435H43OI5098479854" validation="SHA1" />
Mettre sous la <system.web>
balise.
L'AutoGenerate pour le code machine ne peut pas être utilisé. Pour générer votre propre machineKey voir ce script powershell: https://support.microsoft.com/en-us/kb/2915218#bookmark-appendixa
Microsoft dit à ne jamais utiliser le site Web de key generator.
Comme tout le monde ici, j'ai ajouté à mon site web.config.
<System.Web>
<machineKey decryptionKey="ABC123...SUPERLONGKEY...5432JFEI242"
validationKey="XYZ234...SUPERLONGVALIDATIONKEY...FDA"
validation="SHA1" />
</system.web>
cependant, j'ai utilisé IIS comme mon générateur machineKey comme ceci:
- ouvrez IIS et sélectionnez un site web pour obtenir cet écran:
- double clic sur l'icône de la touche Machine pour obtenir ceci écran:
- cliquez sur le lien" Generate Keys " à droite que j'ai souligné dans le pic ci-dessus.
Notes:
- si vous sélectionnez " Générer une clé unique pour chaque application" la case à cocher", IsolateApps " sera ajoutée à la fin de vos clés. J'ai eu de les enlever pour obtenir l'application de travail. De toute évidence, ils ne font pas partie de la clé.
- SHA1 était le cryptage par défaut méthode sélectionnée par IIS et si vous la changez, n'oubliez pas de changer la propriété de validation sur machineKey dans le web.config. Cependant, les méthodes de cryptage et les algorithmes évoluent donc s'il vous plaît n'hésitez pas à modifier ce message avec la méthode de cryptage préféré mise à jour ou le mentionner dans les notes et je les mettrai à jour.
j'avais ce problème, et pour moi la réponse était différente des autres réponses à cette question.
j'ai une application avec beaucoup de clients. Je capte toute erreur dans l'application_error dans global.asax
et je m'envoie un e-mail avec le détail de l'erreur. Après avoir publié une nouvelle version de mes applications, j'ai commencé à recevoir beaucoup de Validation de viewstate MAC message d'erreur échoué.
après une journée de recherche, j'ai réalisé que j'avais une minuterie dans Mes applications, qui rafraîchit panneau de mise à jour chaque minute. Alors, quand j'ai publié une nouvelle version de mes applications, et certains clients ont laissé son ordinateur ouvert sur mon site. Je reçois un message d'erreur à chaque fois que le rafraîchissement de la minuterie parce que de actual viewstate ne correspond pas avec le nouveau. J'ai reçu ce message jusqu'à ce que tous les clients ferment le site web ou rafraîchissent leur navigateur pour obtenir la nouvelle version.
je suis désolé pour mon anglais, et je sais que mon cas est très spécifique, mais si ça peut aider quelqu'un d'enregistrer un jour, je pense que c'est une bonne chose.
Cette solution a fonctionné pour moi dans ASP.NET 4.5 à l'aide d'un site Web de formulaires.
- utilisez le site suivant pour générer une touche Machine:http://www.blackbeltcoder.com/Resources/MachineKey.aspx
- Copier Le Code De Clé Complet De La Machine.
- allez sur votre site web.Fichier De Configuration.
coller la touche Machine Dans le code suivant section:
<configuration
><system.web
><machineKey ... />
</system.web
></configuration
>
vous ne devriez plus voir l'erreur viewstate Mac failed error. Chaque site Web dans le même pool d'applications devrait avoir une clé de machine séparée sinon cette erreur va continuer.
dans un environnement multi-serveur, cette erreur se produit probablement lorsque la session expire et qu'une autre instance d'une application est utilisée avec le même id de session et la même clé machine, mais sur un serveur différent. Au début, chaque serveur Produit sa propre clé machine qui est ensuite associée à une seule instance d'une application. Lorsque la session expire et que le serveur courant est occupé, l'application est redirigée comme, via load balancer vers un serveur plus opérationnel. Dans mon cas, j'exécute la même application à partir de plusieurs serveurs, le message d'erreur:
échec de la Validation de viewstate MAC. Si cette application est hébergée par un Web Farm ou cluster, s'assurer que la configuration spécifie la même clé de validation et le même algorithme de validation
définition du code machine Dans web.config ont résolu le problème. Mais au lieu d'utiliser des sites tiers pour la génération de code qui pourrait être corrompu, s'il vous plaît exécutez ceci à partir de votre shell de commande: Basé sur la solution de microsoft 1a, https://support.microsoft.com/en-us/kb/2915218#AppendixA
# Generates a <machineKey> 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,
"<machineKey decryption=`"{0}`" decryptionKey=`"{1}`" validation=`"{2}`" validationKey=`"{3}`" />",
$decryptionAlgorithm.ToUpperInvariant(), $decryptionKey,
$validationAlgorithm.ToUpperInvariant(), $validationKey)
}
}
Puis:
pour ASP.NET 4,0
Generate-MachineKey
votre clé ressemblera à: <machineKey decryption="AES" decryptionKey="..." validation="HMACSHA256" validationKey="..." />
pour ASP.NET 2,0 et 3,5
Generate-MachineKey -validation sha1
votre clé ressemblera à: <machineKey decryption="AES" decryptionKey="..." validation="SHA1" validationKey="..." />
mon problème était ce morceau de code javascript
$('input').each(function(ele, indx){
this.value = this.value.toUpperCase();
});
se Transforme, c'était de jouer avec viewstate champ caché donc je l'ai changé de code ci-dessous et cela a fonctionné
$('input:visible').each(function(ele, indx){
this.value = this.value.toUpperCase();
});
Ce message d'erreur est normalement affiché après que vous avez publié votre site web sur le serveur.
Le principal problème réside dans le Pool d'Applications que vous utilisez pour votre site web.
configurer votre site web pour utiliser la version .net Framework appropriée (i.e. v4.0) dans la section générale du dossier de candidature relatif à votre site web.
dans le modèle de processus, définissez la valeur D'identité au service réseau.
fermez la boîte de dialogue et cliquez-droit sur votre site web et sélectionnez Paramètres Avancés... à partir de L'option Gérer le site Web du menu Contenu. Dans la boîte de dialogue, sous section générale, assurez-vous que vous avez sélectionné le nom propre du Pool D'applications à utiliser.
Votre site web devrait maintenant fonctionner sans aucun problème.
j'Espère que cela vous aide à surmonter cette erreur.
WHAT DID WORK FOR ME
rechercher sur le web pour "générateur de Macinekey"
aller à l'un des sites trouvés et générer la touche Machine, qui ressemblera... (les chiffres sont plus gros)
...MachineKey
validationKey= " 0EF6C03C11FC...63EAE6A00F0B6B35DD4B "decryptionKey=" 2f5e2fd80991c629...3ACA674CD3B5F068" validation="SHA1" décryptage="AES" />Copier et coller dans
<system.web>
section dans le web.fichier de configuration.
Si vous voulez suivre le chemin que j'ai fait...
https://support.microsoft.com/en-us/kb/2915218#AppendixA
Résolution des erreurs de code D'authentification de message d'état de vue (MAC)
Résolution 3b: utiliser un <machineKey>
En ajoutant un élément du Web de l'application.fichier de configuration, le développeur dit ASP.NET ne pas utiliser le clé cryptographique générée automatiquement. Voir L'Annexe A pour les instructions sur la façon de générer un <machineKey>
élément.
http://blogs.msdn.com/b/amb/archive/2012/07/31/easiest-way-to-generate-machinekey.aspx
La manière la plus facile de générer MachineKey - Ahmet Mithat Bostanci-31 juil. 2012
Vous pouvez effectuer une recherche dans Bing pour "machineKey generator" et utiliser un service en ligne. Honnêtement...
la Validation de viewstate MAC a échoué. Si cette application est hébergée par une ferme web ou une grappe, assurez-vous que <machineKey>
la configuration spécifie la même clé de validation et le même algorithme de validation. AutoGenerate ne peut pas être utilisé dans un cluster.
Réponse :
<machineKey decryptionKey="2CC8E5C3B1812451A707FBAAAEAC9052E05AE1B858993660" validation="HMACSHA256" decryption="AES" validationKey="CB8860CE588A62A2CF9B0B2F48D2C8C31A6A40F0517268CEBCA431A3177B08FC53D818B82DEDCF015A71A0C4B817EA8FDCA2B3BDD091D89F2EDDFB3C06C0CB32" />
j'ai eu ce même problème et il était dû à un Gridview (généré à partir d'un code vb) sur la page qui avait le tri activé. La désactivation de Tri fixé mon problème. Je n'ai pas ce problème avec les gridviews créés en utilisant une source Sqldatas.
Je ne suis pas sûr de la façon dont cela s'est produit, mais j'ai commencé à obtenir cette erreur dans mes pages de formulaire de soumission interne. Donc quand je soumets quelque chose, j'obtiens cette erreur. Mais le problème est que ce site Web fonctionne presque 5-6 ans. Je ne me souviens pas avoir fait un changement important.
Aucune des solutions n'a fonctionné pour moi.
j'ai configuré une clé machine avec le script Microsoft et copié dans mon web.config
j'ai exécuté asp.net Regis script.
aspnet_regiis -ga "IIS APPPOOL\My App Pool"
Aussi essayé d'ajouter ce code dans la page:
enableViewStateMac="false"
toujours pas de chance.
une autre idée pour résoudre ce problème?
mise à jour:
Finalement j'ai résolu le problème. J'avais intégré mon composant angulaire 4 dans mon asp.net site web. Donc j'avais ajouté la base href dans ma page principale. Donc j'ai enlevé ce code et il fonctionne bien maintenant.
<base href="/" />
il y a un autre scénario qui se produisait pour mes clients. Cela se passait normalement dans un certain temps en raison de changements de quart et les utilisateurs ont dû se connecter avec un utilisateur différent. Voici un scénario que le système anti-contrefaçon protège système par génération cette erreur:
1 - une Fois fermer/ouvrir votre navigateur. 2-Allez sur votre site web et connectez-vous avec "User A" 3-Ouvrez un nouvel onglet dans le navigateur et entrez la même adresse site. (Vous pouvez voir votre page d'accueil du site sans aucune authentification) Quatre- Déconnectez-vous de votre site et connectez-vous avec un autre utilisateur(utilisateur B) dans le deuxième onglet. 5 - maintenant, retournez au premier onglet que vous avez ouvert par "User a". Vous pouvez toujours voir la page mais toute action dans cet onglet va faire l'erreur. Parce que votre cookie est déjà mis à jour par "L'utilisateur B" et que vous essayez d'envoyer une demande par un utilisateur non valide. (Utilisateur A)