107

После установки обновления для системы безопасности ASP.NET MVC 3 KB2990942, версия MVC увеличилась с 3.0.0.0 до 3.0.0.1. Это приводит к тому, что Visual Studio больше не находит ссылку.Патч для защиты ASP.NET MVC до версии 3.0.0.1 breaks build

<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 = нейтраль, PublicKeyToken = 31bf3856ad364e35, processorArchitecture = MSIL». Проверьте на убедитесь, что сборка существует на диске. Если эта ссылка обязательна кодом, вы можете получить ошибки в компиляции.

Этот вид имеет смысл. Эта версия больше не существует на моей машине.

Я не могу гарантировать точную версию MVC на машинах dev, строить серверы и производственные серверы. Они могут иметь 3.0.0.0 или 3.0.0.1, и это может измениться в любое время. Windows Update может выпускать новые версии MVC в любое время. Кроме того, я не хочу увеличивать номер версии во всех * .csproj-файлах при выпуске обновления MVC.

Несколько версий затронуты обновление:

Бюллетень безопасности: MS14-059: Vulnerability in ASP.NET MVC Could Allow Security Feature Bypass (2990942)

Каков наилучший способ справиться с этой ситуацией? Как я могу разблокировать сборку и производство и быть в безопасности в отношении будущих обновлений MVC?

+6

Тот же выпуск сегодня с 4.0.0.1, мы просто переименовали System.Web.Mvc. Было бы неплохо иметь более надежное решение для ссылок. – Oliver

+0

Вы должны, по крайней мере, иметь возможность гарантировать, что ваши серверы сборки и производственные серверы будут работать в одинаковой среде. У машин Dev могут быть не синхронизированы, но вы можете справляться с такими проблемами, когда они возникают. Ваши серверы сборки должны раскрывать любые проблемы. – Stijn

+2

@Stijn Я планирую это сделать, но я не могу гарантировать, что обновления происходят в одно и то же время. Процесс разработки должен работать сам по себе в течение нескольких недель без ручного внимания. – usr

ответ

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 после обновления серверов. В следующий раз, когда Microsoft сделает такое обновление, они, вероятно, знают, что сначала исправят такие проблемы.

+1

Я сделал то же самое, кроме изменения локального свойства копии ссылки. Похоже, что мой проект работает. – TK1

+0

Имейте в виду, что эти исправления не отображаются в виде установленных обновлений, вам нужно взглянуть на Asp.Net MVC#, показанный в обычных программах удаления add, у него будет дата установки, когда был применен патч (для меня 10.15. 2014) –

+0

@ EricBrown-Cal: Вы имеете в виду обновление версии сервера?На моем компьютере он отображается как установленное обновление. – Guffa

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

+0

Не удается найти этот файл в моей системе. Любая ссылка для этой информации? – Julian

+1

@julian, так как это gac, вам, возможно, придется перемещаться по каталогу с помощью командной строки с повышенными правами. Также я считаю, что это применимо только в том случае, если вы установили mvc, если вы используете nuget (bin deploy) mvc, это может не присутствовать в вашей системе. –

+1

Интересно, что можно (1) применить обновление и получить этот файл конфигурации, затем (2a) вернуться и обновить его пакет NuGet до последней версии и (2b) забыли или не смогли (например, от плохого возврата) до обновите переадресацию привязки в файле web.config. Результат? Существующий сервер отлично, но если вы попытаетесь развернуть его на новый сервер, на котором не установлено обновление (и он не будет предлагаться до тех пор, пока он не увидит старую версию), вы будете бомбить, потому что ваш bindingRedirect был не прав всем и вы этого не осознали - вы были спасены этим дополнительным перенаправлением, предоставленным обновлением. –

26

Я установил пакет Microsoft.AspNet.Mvc в свой проект, используя Nuget.

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 от агентов сборки –

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 (например, включая тестовый проект).