web-dev-qa-db-fra.com

Asp.net La validation du MAC Viewstate a échoué

Je reçois l’erreur suivante à certains moments sur le site asp.net.

 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.

Quand le rafraîchissement de la page est terminé, aucun problème. Comment puis-je résoudre ce problème?

27
Arbelac

Si vous utilisez une batterie de serveurs Web et exécutez la même application sur plusieurs ordinateurs, vous devez définir explicitement la clé d'ordinateur dans le fichier machine.config:

<machineKey validationKey="JFDSGOIEURTJKTREKOIRUWTKLRJTKUROIUFLKSIOSUGOIFDS..." decryptionKey="KAJDFOIAUOILKER534095U43098435H43OI5098479854" validation="SHA1" />

Placez-le sous la balise <system.web>.

L'AutoGenerate pour le code machine ne peut pas être utilisé. Pour générer votre propre machineKey, consultez le script powershell suivant: https://support.Microsoft.com/en-us/kb/2915218#bookmark-appendixa

23
mBotros

Microsoft dit de ne jamais utiliser un site Web générateur de clé .

Comme tout le monde ici, j'ai ajouté ceci à mon web.config.

<System.Web> <machineKey decryptionKey="ABC123...SUPERLONGKEY...5432JFEI242" validationKey="XYZ234...SUPERLONGVALIDATIONKEY...FDA" validation="SHA1" /> </system.web>

Cependant, j'ai utilisé IIS comme générateur MachineKey comme ceci:

  1. Ouvrez IIS et sélectionnez un site Web pour obtenir cet écran:

 enter image description here

  1. Double-cliquez sur l’icône Clé de la machine pour obtenir cet écran:

 enter image description here

  1. Cliquez sur le lien "Générer des clés" à droite que j'ai décrit dans la photo ci-dessus.

Remarques:

  • Si vous cochez la case "Générer une clé unique pour chaque application". "", "IsolateApps" sera ajouté à la fin de vos clés. Je devais les supprimer pour que l'application fonctionne. De toute évidence, ils ne font pas partie de la clé.
  • SHA1 était la méthode de cryptage sélectionnée par IIS et si vous la modifiez, n'oubliez pas de modifier la propriété de validation sur machineKey dans le fichier web.config. Cependant, les méthodes et les algorithmes de cryptage évoluant, n'hésitez donc pas à éditer ce message avec la méthode de cryptage préférée mise à jour ou à le mentionner.
14
Tony L.

J'ai eu 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. J'attrape toutes les erreurs dans application_error dans global.asax et je m'envoie un email avec le détail de l'erreur. Après avoir publié une nouvelle version de mes applications, j'ai commencé à recevoir un grand nombre de messages d'erreur Validation of viewstate MAC. 

Après une journée de recherche, je me suis rendu compte que j’avais une minuterie dans mes applications, qui actualisait chaque minute un panneau de mise à jour. Ainsi, lorsque j'ai publié une nouvelle version de mes applications, et qu'une cliente a laissé son ordinateur ouvert sur mon site Web. Je reçois un message d'erreur chaque fois que le minuteur s'actualise, car l'état actuel de viewstate ne correspond pas au nouveau. J'ai reçu ce message jusqu'à ce que tous les clients aient fermé le site Web ou actualisé 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 cela peut aider quelqu'un à gagner un jour, je pense que c'est une bonne chose. 

14
Sébastien

Cette solution fonctionnait pour moi dans ASP.NET 4.5 à l'aide d'un site Web Forms. 

  1. Utilisez le site suivant pour générer une clé d'ordinateur: http://www.blackbeltcoder.com/Resources/MachineKey.aspx
  2. Copier le code de clé d'ordinateur complet.
  3. Accédez à votre fichier Web.Config.
  4. Collez la clé de la machine dans la section de code suivante:

    <configuration>

    <system.web>

    <machineKey ... />
    

    </system.web>

    </configuration

Vous ne devriez plus voir l'erreur Viewstate Mac Failed. Chaque site Web du même pool d'applications doit avoir une clé d'ordinateur distincte sinon cette erreur se poursuivra.

8
TsTeaTime

Sur un environnement multi-serveur, cette erreur se produit probablement lorsque la session expire et qu'une autre instance d'une application est appelée avec le même identifiant de session et la même clé d'ordinateur, mais sur un autre serveur. Tout d'abord, chaque serveur produit sa propre clé d'ordinateur, qui est ensuite associée à une seule instance d'une application. Lorsque la session expire et que le serveur actuel est occupé, l'application est redirigée comme, via l'équilibreur de charge, vers un serveur plus opérationnel. Dans mon cas, je lance la même application à partir de plusieurs serveurs, le message d'erreur suivant: 

La validation du MAC Viewstate a échoué. Si cette application est hébergée par un Ferme Web ou cluster, assurez-vous que la configuration spécifie la même validationKey et le même algorithme de validation

Définir le code machine sous web.config a résolu le problème . Mais au lieu d’utiliser des sites tiers pour la génération de code qui pourraient être corrompus, veuillez l’exécuter à partir de votre commande Shell: Sur la base de la solution 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)
  }
}

Ensuite:

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="..." />

2
Zly-Zly

mon problème était ce morceau de code javascript

$('input').each(function(ele, indx){
    this.value = this.value.toUpperCase();
});

Il était en train de déconner avec le champ caché de viewstate alors je l'ai changé en dessous du code

$('input:visible').each(function(ele, indx){
    this.value = this.value.toUpperCase();
});
1
irfandar

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 Trier a résolu mon problème. Je n'ai pas ce problème avec les vues de grille créées en utilisant un SQLdatasource. 

0
aydin

Ce message d'erreur s'affiche normalement après la publication de votre site Web sur le serveur.

Le principal problème réside dans le pool d'applications que vous utilisez pour votre site Web. 

Configurez votre site Web pour utiliser la version appropriée de .NET Framework (c'est-à-dire v4.0) dans la section Général du pool d'applications associé à votre site Web. 

Sous Modèle de processus, définissez la valeur Identité sur Service réseau. 

Fermez la boîte de dialogue, cliquez avec le bouton droit de la souris sur votre site Web et sélectionnez Paramètres avancés ... dans l’option Gérer le site Web du menu contenu. Dans la boîte de dialogue, sous la section Général, assurez-vous que vous avez sélectionné le nom correct 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.

0
Nanan

Je ne sais pas comment cela s'est passé, mais j'ai commencé à avoir cette erreur dans les pages de mon formulaire de soumission interne. Donc, chaque fois que je soumets quelque chose, je reçois cette erreur. Mais le problème est que ce site Web fonctionne presque 5-6 ans. Je ne me souviens pas d'avoir apporté 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 regiis 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?

METTRE À JOUR:

Enfin, j’ai résolu le problème… .. j’avais intégré ma composante angulaire 4 à mon site Web asp.net… j’avais donc ajouté la base href dans ma page principale. J'ai donc supprimé ce code et il fonctionne bien maintenant.

<base href="/" />
0
Salim

Un autre scénario se produisait pour mes clients. Cela se produisait normalement à un certain moment en raison de changements de quart de travail et les utilisateurs devaient se connecter avec un utilisateur différent. Voici un scénario dans lequel le système anti-falsification protège le système en générant cette erreur: 

1- Une fois que vous fermez/ouvrez votre navigateur . 2- Allez sur votre site web et connectez-vous avec "Utilisateur A" 3- Ouvrez un nouvel onglet dans le navigateur et entrez le même site d'adresse. (Vous pouvez voir la page d'accueil de votre site sans aucune authentification) 4- 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 auquel vous vous êtes connecté par "Utilisateur A". Vous pouvez toujours voir la page, mais toute action dans cet onglet fera 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 invalide. (Utilisateur A)

0
Tomcat0x4d2e47

CE QUE DID A TRAVAILLÉ POUR MOI 

  1. Recherchez sur le Web "générateur MachineKey" 

  2. Accédez à l'un des sites trouvés et générez la clé de machine, qui ressemblera à ... (les chiffres sont plus gros)
    ... MachineKey
    validationKey = "0EF6C03C11FC ... 63EAE6A00F0B6B35DD4" decryptionKey = "2F5E2FD80991C629 ... 3ACA674CD3B5F068" validation = "SHA1" decryption = "AES" />

  3. Copiez et collez dans la section <system.web> du fichier web.config.

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 d'affichage (MAC) Résolution 3b: utilisez un <machineKey> explicite
En ajoutant un élément <machineKey> explicite au fichier Web.config de l'application, le développeur indique à ASP.NET de ne pas utiliser la clé cryptographique générée automatiquement. Voir l’Annexe A pour des instructions sur la génération d’un élément <machineKey>.


http://blogs.msdn.com/b/amb/archive/2012/07/31/easiest-way-to-generate-machinekey.aspx
Meilleure façon de générer MachineKey - Ahmet Mithat Bostanci - 31 juil. 2012 Vous pouvez rechercher dans Bing un "générateur MachineKey" et utiliser un service en ligne. Honnêtement...


http://www.blackbeltcoder.com/Resources/MachineKey.aspx

0
Ricardo Conte

La validation du MAC Viewstate a échoué. Si cette application est hébergée par une batterie de serveurs Web ou un cluster, vérifiez que la configuration <machineKey> spécifie le même algorithme de validationKey et de validation. AutoGenerate ne peut pas être utilisé dans un cluster.

Réponse :

<machineKey  decryptionKey="2CC8E5C3B1812451A707FBAAAEAC9052E05AE1B858993660" validation="HMACSHA256" decryption="AES" validationKey="CB8860CE588A62A2CF9B0B2F48D2C8C31A6A40F0517268CEBCA431A3177B08FC53D818B82DEDCF015A71A0C4B817EA8FDCA2B3BDD091D89F2EDDFB3C06C0CB32" />

0
Tavasul Ahmed