ASP.NET MVC安全补丁到版本3.0.0.1打破构build

在安装ASP.NET MVC 3安全更新KB2990942之后,MVC版本从3.0.0.0增加到了3.0.0.1 。 这会导致Visual Studio不再查找引用。

 <Reference Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> 

Resharper没有显示任何问题,但是构build失败了很多未解决的MVCtypes和警告:

警告 :无法parsing此引用。 找不到程序集“System.Web.Mvc,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35,processorArchitecture = MSIL”。 检查以确保程序集存在于磁盘上。 如果您的代码需要此引用,则可能会收到编译错误。

这种说法是有道理的。 我的机器上不再有这个版本。

我无法保证开发机器上的确切MVC版本,构build服务器和生产服务器。 他们可能有3.0.0.03.0.0.1 ,这可能随时改变。 Windows Update可能随时发布新的MVC版本。 另外,我不想在每次发布MVC更新时增加所有* .csproj文件的版本号。

更新会影响多个版本:

  • KB 2993939:Microsoft ASP.NET MVC 2的安全更新
  • KB 2993937:Microsoft ASP.NET MVC 3的安全更新
  • KB 2993928:Microsoft ASP.NET MVC 4.0的安全更新
  • KB 2992080:Microsoft ASP.NET MVC 5.0的安全更新

安全公告: MS14-059:ASP.NET MVC中的漏洞可能允许绕过安全function(2990942)

处理这种情况的最好方法是什么? 我怎样才能打破构build和生产,并对未来的MVC更新安全?

我解决了这个问题:

  • 删除MVC参考并为项目添加正确的参考。
  • 将引用的Copy Local属性更改为true
  • 更新web.configbindingRedirect设置:

web.config runtime部分:

 <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.1" /> </dependentAssembly> ... 

更改“ Copy Local设置将在发布项目时在bin文件夹中包括System.Web.MVC.dll文件,以便即使未使用新版本更新服务器,也能正常工作。

请注意,这样的更新很less发生。 这是MVC 3自发布以来第一次进行了修补。 一旦服务器更新,您应该能够将“ Copy Local更改为“ false ”。 当微软下次进行这样的更新时,他们可能会首先解决这样的问题。

我使用Nuget在我的项目中安装了Microsoft.AspNet.Mvc软件包。

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

这解决了这个问题。 详细信息: http : //blogs.msdn.com/b/webdev/archive/2014/10/16/microsoft-asp-net-mvc-security-update-broke-my-build.aspx

生产系统应该没问题,因为修补程序会将configuration文件( System.Web.Mvc.dll.config )传递到以下文件夹中:

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

configuration文件包含一个程序集redirect到新的版本,这将覆盖你的web.config中的任何东西:

 <?xml version="1.0"?> <!-- http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx#BKMK_Redirectingassemblyversionsbyusingpublisherpolicy --> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="3.0.0.0-3.0.0.1" newVersion="3.0.0.1"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration> 

按照@Guffa的build议为您的构build系统,或使用nuget更新。 我相信解决scheme的工作取决于您如何交付MVC二进制文件到您的系统(bin部署或GAC)。

在我的情况下工作是更改项目文件中的Reference元素,所以Version=3.0.0.0现在Version=3.0.0.1 。 我还将位于_bin_deployableAssemblies文件夹中的System.Web.Mvc.dll文件更新为新版本,并在Reference元素中添加了一个指向所述dll的HintPath元素,所以即使在GAC中我们仍然拥有3.0.0.0版本。

棘手的部分是不要忘记在引用System.Web.Mvc所有项目(例如包括testing项目)中更新引用。