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.0
或3.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.config
的bindingRedirect
设置:
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项目)中更新引用。