107

安裝ASP.NET MVC 3安全更新KB2990942後,它似乎MVC版本從3.0.0.0增加到3.0.0.1。這會導致Visual Studio不再查找引用。ASP.NET MVC安全修補程序版本3.0.0.1打破構建

<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 Update可能隨時發佈新的MVC版本。另外,每當發佈MVC更新時,我都不想增加所有* .csproj文件中的版本號。

多個版本的受更新:

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

處理這種情況的最佳方法是什麼?我如何在構建和生產過程中實現安全性,並在未來的MVC更新中保持安全?

+6

與4.0.0.1相同的問題,我們只是重新引用了System.Web.Mvc。擁有更強大的參考解決方案會很好。 – Oliver 2014-10-16 14:31:46

+0

您應至少能夠保證您的構建服務器和生產服務器在相同的環境中運行。開發機器可能會不同步,但您可以在出現這些問題時處理這些問題。您的構建服務器應該發現任何問題。 – Stijn 2014-10-16 14:45:33

+2

@Stijn我打算這樣做,但我不能保證更新在同一時間發生。開發過程必須獨立工作幾周,無需人工關注。 – usr 2014-10-16 14:46:42

回答

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

除了更改複製本地屬性的參考。這似乎使我的項目工作。 – TK1 2014-10-16 16:32:08

+0

請注意,這些修補程序不會顯示爲已安裝的更新,您必須查看正常添加刪除程序下顯示的Asp.Net MVC#,它將在應用修補程序時有一個安裝日期(對我而言爲10.15。 2014) – 2014-10-16 20:11:45

+0

@ EricBrown-Cal:你的意思是服務器版本更新?在我的電腦上,它顯示爲已安裝的更新。 – Guffa 2014-10-16 23:42:57

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)。

+0

在我的系統上找不到這個文件。有關此信息的任何參考? – Julian 2014-10-17 20:22:49

+1

@ julian因爲它可能是你使用提升命令提示符遍歷目錄的gac。此外,我相信這隻適用於如果您安裝mvc,如果您nuget(斌部署)mvc這可能不會出現在您的系統上。 – 2014-10-18 06:59:54

+1

有趣的是,人們可以(1)應用更新並獲得該配置文件,然後(2a)返回並將他的NuGet包更新爲最新版本,並且(2b)忘記或失敗(例如從不正確的恢復)到更新web.config文件中的綁定重定向。結果?現有的服務器很好,但是如果你嘗試部署到一臺沒有安裝更新的新服務器(並且它不會提供,直到它看到舊版本加載),你會因爲你的bindingRedirect錯誤而彈出並且你沒有意識到 - 你被這個更新提供的額外重定向所保存。 – 2014-10-28 18:17:19

26

我在我的項目中使用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

+1

謝謝,這對我們來說是最好的解決方案,它消除了GAC中正確版本對構建代理的依賴 – 2015-04-23 20:01:30

1

在什麼情況下,我的工作是改變Reference元素在項目文件中,以便Version=3.0.0.0現在Version=3.0.0.1。我還將位於_bin_deployableAssemblies文件夾中的System.Web.Mvc.dll文件更新爲新版本,並在指向所述dll的Reference元素中添加了HintPath元素,因此即使在GAC中我們仍然具有版本3.0.0.0時,它也會被拾取。

棘手的部分是不要忘記更新引用System.Web.Mvc(例如包括測試項目)的所有項目中的引用。