107

安装 ASP.NET MVC 3 安全更新KB2990942后,MVC 版本似乎3.0.0.03.0.0.1. 这会导致 Visual Studio 不再找到该引用。

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

Resharper 没有显示任何问题,但构建失败并出现许多未解决的 MVC 类型和警告:

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

这种有道理。这个版本不再存在于我的机器上。

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

多个版本受更新影响:

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

处理这种情况的最佳方法是什么?我如何才能打破构建和生产并在未来的 MVC 更新方面安全?

4

4 回答 4

66

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

  • 删除 MVC 引用并将正确的引用添加到项目中。
  • Copy Local将引用的属性更改为true.
  • 更新中的bindingRedirect设置web.config

web.configruntime部分:

<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下次微软进行这样的更新时,他们可能会知道首先解决这样的问题。

于 2014-10-16T16:15:26.063 回答
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

于 2014-10-21T15:33:15.197 回答
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 deploy 或 GAC)。

于 2014-10-17T08:26:01.607 回答
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(例如,包括测试项目)。

于 2014-11-12T19:35:58.247 回答