安装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没有显示任何问题,但构建失败,有许多未解析的MVC类型和警告:
警告:无法解析此引用。无法找到 assembly&#34; System.Web.Mvc,Version = 3.0.0.0,Culture = neutral, PublicKeyToken = 31bf3856ad364e35,processorArchitecture = MSIL&#34;。检查 确保程序集存在于磁盘上。如果需要此引用 通过您的代码,您可能会遇到编译错误。
这种有道理。我的机器上不再存在此版本。
我无法保证dev机器,构建服务器和生产服务器上的确切MVC版本。他们可能有3.0.0.0
或3.0.0.1
,这可能随时发生变化。 Windows Update可能随时发布新的MVC版本。此外,每当发布MVC更新时,我都不想增加所有* .csproj文件中的版本号。
更新会影响多个版本:
安全公告:MS14-059: Vulnerability in ASP.NET MVC Could Allow Security Feature Bypass (2990942)
处理这种情况的最佳方法是什么?我怎样才能破坏构建和生产,并对未来的MVC更新保持安全?
答案 0 :(得分:66)
我通过以下方式解决了这个问题:
Copy Local
属性更改为true
。bindingRedirect
中的web.config
设置: 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
设置将在System.Web.MVC.dll
文件夹中包含bin
文件,这样即使服务器未使用新版本更新,它也能正常工作。
请注意,这样的更新很少发生。这是MVC 3自发布以来第一次被修补。服务器更新后,您应该能够将Copy Local
更改回false
。下次微软进行这样的更新时,他们可能会知道首先解决这类问题。
答案 1 :(得分:27)
我使用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
答案 2 :(得分:12)
您的生产系统应该没问题,因为此修补程序将配置文件( System.Web.Mvc.dll.config )传递到以下文件夹中:
%SystemRoot%\assembly\GAC_MSIL\policy.3.0.System.Web.Mvc\3.0.0.1__31bf3856ad364e35
配置文件包含重定向到新版本的程序集,这将覆盖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对构建系统的建议,或使用nuget进行更新。我相信有效的解决方案取决于您如何将MVC二进制文件传送到您的系统(bin部署或GAC)。
答案 3 :(得分:1)
在我的案例中有用的是更改项目文件中的Reference
元素,因此Version=3.0.0.0
现在是Version=3.0.0.1
。我还将位于System.Web.Mvc.dll
文件夹中的_bin_deployableAssemblies
文件更新为新版本,并在HintPath
元素中添加了Reference
元素,指向所述dll,以便即使在GAC我们仍然有3.0.0.0版本。
棘手的部分是不要忘记在引用System.Web.Mvc
的所有项目中更新引用(例如包括测试项目)。