Патч безопасности ASP.NET MVC до версии 3.0.0.1 ломает сборку

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

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

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

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

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

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


comment
Та же проблема сегодня с 4.0.0.1, мы просто повторно ссылаемся на System.Web.Mvc. Было бы неплохо иметь более надежное решение для ссылок.   -  person Oliver    schedule 16.10.2014
comment
По крайней мере, вы должны быть в состоянии гарантировать, что ваши серверы сборки и рабочие серверы работают в идентичной среде. Машины разработчиков могут работать не синхронизированно, но вы можете справиться с такими проблемами, когда они возникают. Ваши серверы сборки должны выявить любые проблемы.   -  person user247702    schedule 16.10.2014
comment
@Stijn Я планирую это сделать, но не могу гарантировать, что обновления будут происходить одновременно. Процесс разработки должен работать сам по себе в течение нескольких недель без ручного вмешательства.   -  person usr    schedule 16.10.2014
comment
При этом, это может быть раздражающей проблемой. Обновления еще не попали на наши машины, знаете ли вы, если это сломает производство? И я вижу в Центре обновления Windows, что затронуты MVC 2, 3, 4 и 5.   -  person user247702    schedule 16.10.2014
comment
Это не нарушило работу с MVC 3. В GAC я нашел System.Web.Mvc.dll.config с перенаправлением привязки. Судя по всему, этот файл используется CLR.   -  person usr    schedule 16.10.2014
comment
У нас было точно такое же поведение, но ни один из перечисленных патчей не был установлен на наших машинах... странные... патчи были установлены только не с теми номерами, которые перечислены.   -  person Eric Brown - Cal    schedule 16.10.2014
comment
@ Эрик, эти номера исправлений предназначены для системы Windows 7 x64, они могут отличаться для других систем.   -  person user247702    schedule 16.10.2014
comment
Не проблема (у меня w7 64, кстати), он вообще не отображается в установленных обновлениях, оказывается, он отображается как переустановка asp.net mvc #.. дата установки и версия файла # меняются.   -  person Eric Brown - Cal    schedule 17.10.2014
comment
Связано: System.Web.MVC не копируется в папку bin с MS14-059   -  person Danny Tuppeny    schedule 20.10.2014


Ответы (4)


Я исправил это:

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

person Guffa    schedule 16.10.2014
comment
Я сделал то же самое, за исключением изменения локального свойства копии ссылки. Это, кажется, заставляет мой проект работать. - person TK1; 16.10.2014
comment
Имейте в виду, что эти исправления не отображаются как установленные обновления, вам нужно посмотреть на Asp.Net MVC #, показанный в обычных программах добавления и удаления, у него будет дата установки, когда было применено исправление (для меня 15.10.2014 ) - person Eric Brown - Cal; 17.10.2014
comment
@EricBrown-Cal: Вы имеете в виду обновление версии сервера? На моем компьютере он отображается как установленное обновление. - person Guffa; 17.10.2014
comment
Настройка CopyLocal=true нам не помогла; см.: System.Web.MVC не копируется в папку bin с MS14-059 - person Danny Tuppeny; 20.10.2014
comment
Для меня, если вы откроете «Добавить удаление программ/функций» и нажмете «Просмотреть установленные обновления», базы знаний не появятся. Если вы вернетесь, чтобы добавить удаление, перейдите к asp.net MVC (3 в моем случае), он покажет, что он установлен с новой датой (в моем случае 15.10.14). Это был единственный способ обнаружить это на моей машине, кроме сравнения файлов/путей. - person Eric Brown - Cal; 22.10.2014
comment
@EricBrown-Cal: Да, по какой-то причине в этом списке не отображаются все обновления. Если я открою «Настройки ПК», перейду в «Обновление и восстановление» и нажму «Просмотреть историю обновлений», он покажет все обновления. - person Guffa; 22.10.2014
comment
Это частично решило проблему для меня, так как мое решение снова строится. Однако теперь он показывает мне несколько предупреждений: Assuming assembly reference 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' matches 'System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35', you may need to supply runtime policy - person Wouter; 23.10.2014

Я установил пакет 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

person gunnerz    schedule 21.10.2014
comment
Спасибо, это было лучшее решение для нас, и оно устранило зависимость правильной версии в GAC от агентов сборки. - person Matt Sanders; 23.04.2015

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

person David Martin    schedule 17.10.2014
comment
Не могу найти этот файл в моей системе. Любая ссылка на эту информацию? - person Julian; 18.10.2014
comment
@julian, так как это gac, вам, возможно, придется пройтись по каталогу с помощью командной строки с повышенными привилегиями. Также я считаю, что это применимо только в том случае, если вы установили mvc, если вы используете nuget (bin deploy) mvc, этого может не быть в вашей системе. - person David Martin; 18.10.2014
comment
Что интересно, можно (1) применить обновление и получить этот конфигурационный файл, затем (2а) вернуться и обновить свой пакет NuGet до самой новой версии и (2б) забыть или потерпеть неудачу (например, из-за плохого возврата) для обновления перенаправление привязки в вашем файле web.config. Результат? С существующим сервером все в порядке, но если вы попытаетесь выполнить развертывание на новом сервере, на котором не установлено обновление (и оно не будет предлагаться, пока не увидит загруженную старую версию), вы будете бомбить, потому что ваш bindingRedirect был неправильным все вместе, и вы этого не осознавали - вы были спасены этим дополнительным перенаправлением, предоставленным обновлением. - person Nicholas Piasecki; 28.10.2014

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

person Pol    schedule 12.11.2014