版本3.0.0.1的ASP.NET MVC安全补丁打破了构建

时间:2014-10-16 14:27:22

标签: .net asp.net-mvc versioning assembly-references assembly-binding-redirect

安装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.03.0.0.1,这可能随时发生变化。 Windows Update可能随时发布新的MVC版本。此外,每当发布MVC更新时,我都不想增加所有* .csproj文件中的版本号。

更新会影响多个版本:

安全公告:MS14-059: Vulnerability in ASP.NET MVC Could Allow Security Feature Bypass (2990942)

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

4 个答案:

答案 0 :(得分:66)

我通过以下方式解决了这个问题:

  • 删除MVC参考并为项目添加正确的引用。
  • 将引用的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的所有项目中更新引用(例如包括测试项目)。