Патч для защиты ASP.NET MVC до версии 3.0.0.1 breaks build

После установки обновления для системы безопасности 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 и предупреждения:

Предупреждение. Не удалось устранить эту ссылку. Не удалось найти сборка "System.Web.Mvc, Version = 3.0.0.0, Культура = нейтральная, PublicKeyToken = 31bf3856ad364e35, processorArchitecture = MSIL". убедитесь, что сборка существует на диске. Если требуется эта ссылка по вашему коду вы можете получить ошибки компиляции.

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

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

Обновление зависит от нескольких версий:

Бюллетень по безопасности: MS14-059: Уязвимость в ASP.NET MVC делает возможным обход безопасности (2990942)

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

Ответ 1

Я исправил это следующим образом:

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

Ответ 3

Ваша производственная система должна быть в порядке, поскольку исправление предоставляет файл конфигурации (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).

Ответ 4

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