Correctif de sécurité ASP.NET MVC pour la version 3.0.0.1 interrompt la génération

Après l’installation de la mise à jour de sécurité ASP.NET MVC 3 KB2990942 il apparaît que la version de MVC est passée de 3.0.0.0 à 3.0.0.1 . Cela provoque Visual Studio pour ne plus trouver la référence.

  

Resharper ne présente aucun problème, mais la génération échoue avec de nombreux types de MVC non résolus et un avertissement:

Avertissement : Impossible de résoudre cette référence. Impossible de localiser l’assembly “System.Web.Mvc, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35, processorArchitecture = MSIL”. Vérifiez que l’assemblage existe sur le disque. Si cette référence est requirejse par votre code, vous pouvez obtenir des erreurs de compilation.

Cela a du sens. Cette version n’existe plus sur ma machine.

Je ne peux pas garantir la version exacte de MVC sur les machines de développement, les serveurs de génération et les serveurs de production. Ils pourraient avoir 3.0.0.0 ou 3.0.0.1 et cela pourrait changer à tout moment. Windows Update peut publier de nouvelles versions de MVC à tout moment. De plus, je ne veux pas augmenter le numéro de version dans tous les fichiers * .csproj chaque fois qu’une mise à jour de MVC est publiée.

Les versions multiples sont affectées par la mise à jour:

  • KB 2993939: Mise à jour de sécurité pour Microsoft ASP.NET MVC 2
  • KB 2993937: Mise à jour de sécurité pour Microsoft ASP.NET MVC 3
  • KB 2993928: Mise à jour de sécurité pour Microsoft ASP.NET MVC 4.0
  • KB 2992080: Mise à jour de sécurité pour Microsoft ASP.NET MVC 5.0

Le bulletin de sécurité: MS14-059: Une vulnérabilité dans ASP.NET MVC pourrait permettre de contourner la fonctionnalité de sécurité (2990942)

Quelle est la meilleure façon de gérer cette situation? Comment puis-je débloquer la construction et la production et être sûr des futures mises à jour de MVC?

J’ai corrigé cela par:

  • Suppression de la référence MVC et ajout de la référence correcte au projet.
  • Changer la propriété Copy Local de la référence à true .
  • Mettez à jour le paramètre bindingRedirect dans web.config :

section d’ runtime web.config:

       ... 

La modification du paramètre Copy Local inclura le fichier System.Web.MVC.dll dans le dossier bin lorsque vous publiez le projet, de sorte qu’il fonctionne même si le serveur n’est pas mis à jour avec la nouvelle version.

Notez que de telles mises à jour sont rares. C’est la première fois que MVC 3 a été corrigé depuis sa sortie. Vous devriez être en mesure de remplacer Copy Local par false une fois les serveurs mis à jour. La prochaine fois que Microsoft fera une mise à jour comme celle-ci, elle saura probablement résoudre ce problème en premier.

J’ai installé le package Microsoft.AspNet.Mvc dans mon projet à l’aide de Nuget.

 Install-Package Microsoft.AspNet.Mvc -Version  -Project PROJECTNAME MVC 4 version: 4.0.40804.0 MVC 3 version: 3.0.50813.1 

Cela a résolu le problème. Détails ici: http://blogs.msdn.com/b/webdev/archive/2014/10/16/microsoft-asp-net-mvc-security-update-broke-my-build.aspx

Votre système de production devrait fonctionner correctement, car le correctif logiciel fournit un fichier de configuration ( System.Web.Mvc.dll.config ) dans le dossier suivant:

 %SystemRoot%\assembly\GAC_MSIL\policy.3.0.System.Web.Mvc\3.0.0.1__31bf3856ad364e35 

Le fichier de configuration contient une redirection d’assembly vers la nouvelle version, cela remplacera tout ce que vous avez dans votre fichier web.config:

             

Suivez les conseils de @Guffa pour votre système de construction ou utilisez nuget pour mettre à jour. Je pense que la solution qui fonctionne dépend de la manière dont vous livrez les binarys MVC à votre système (bin deploy ou GAC).

Ce qui a fonctionné dans mon cas était de changer l’élément Reference dans le fichier de projet pour que Version=3.0.0.0 soit maintenant Version=3.0.0.1 . J’ai également mis à jour le fichier System.Web.Mvc.dll dans le dossier _bin_deployableAssemblies vers la nouvelle version et ajouté un élément HintPath dans l’élément Reference pointant vers cette DLL afin de le récupérer même dans GAC.

La partie délicate consiste à ne pas oublier de mettre à jour la référence dans tous les projets faisant référence à System.Web.Mvc (par exemple, y compris un projet de test).