mezclar - El parche de seguridad ASP.NET MVC para la versión 3.0.0.1 rompe la compilación
web forms c# ejemplos (4)
Arreglé esto por:
- Eliminando la referencia MVC y agregue la referencia correcta al proyecto.
-
Cambiar la propiedad
Copy Local
de la referencia atrue
. -
Actualice la configuración
bindingRedirect
enweb.config
:
sección de
runtime
web.config:
<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>
...
Cambiar la configuración de
Copy Local
incluirá el archivo
System.Web.MVC.dll
en la carpeta
bin
cuando publique el proyecto, para que funcione incluso si el servidor no se actualiza con la nueva versión.
Tenga en cuenta que las actualizaciones como esta rara vez ocurren.
Esta es la primera vez que MVC 3 ha sido parcheado desde su lanzamiento.
Debería poder volver a
Copy Local
a
false
una vez que se hayan actualizado los servidores.
La próxima vez que Microsoft haga una actualización como esta, probablemente sabrán solucionar problemas como este primero.
Esta pregunta ya tiene una respuesta aquí:
Después de instalar la actualización de seguridad ASP.NET MVC 3
KB2990942
, parece que la versión MVC aumentó de
3.0.0.0
a
3.0.0.1
.
Esto hace que Visual Studio ya no encuentre la referencia.
<Reference Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
Resharper no muestra ningún problema, pero la compilación falla con muchos tipos de MVC sin resolver y una advertencia:
Advertencia : no se pudo resolver esta referencia. No se pudo encontrar el ensamblado "System.Web.Mvc, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35, processorArchitecture = MSIL". Verifique que el ensamblaje exista en el disco. Si su código requiere esta referencia, puede obtener errores de compilación.
Esto tiene sentido. Esta versión ya no existe en mi máquina.
No puedo garantizar la versión exacta de MVC en máquinas de desarrollo, servidores de compilación y servidores de producción.
Pueden tener
3.0.0.0
o
3.0.0.1
y esto puede cambiar en cualquier momento.
Windows Update podría lanzar nuevas versiones de MVC en cualquier momento.
Además, no quiero aumentar el número de versión en todos los archivos * .csproj cada vez que se lanza una actualización MVC.
Varias versiones se ven afectadas por la actualización:
- KB 2993939: Actualización de seguridad para Microsoft ASP.NET MVC 2
- KB 2993937: Actualización de seguridad para Microsoft ASP.NET MVC 3
- KB 2993928: Actualización de seguridad para Microsoft ASP.NET MVC 4.0
- KB 2992080: Actualización de seguridad para Microsoft ASP.NET MVC 5.0
El boletín de seguridad: MS14-059: una vulnerabilidad en ASP.NET MVC podría permitir la omisión de características de seguridad (2990942)
¿Cuál es la mejor manera de lidiar con esta situación? ¿Cómo puedo desbloquear la construcción y producción y estar seguro con respecto a futuras actualizaciones de MVC?
Instalé el paquete Microsoft.AspNet.Mvc en mi proyecto usando Nuget.
Install-Package Microsoft.AspNet.Mvc -Version <version> -Project PROJECTNAME
MVC 4 version: 4.0.40804.0
MVC 3 version: 3.0.50813.1
Esto solucionó el problema. Detalles aquí: http://blogs.msdn.com/b/webdev/archive/2014/10/16/microsoft-asp-net-mvc-security-update-broke-my-build.aspx
Lo que funcionó en mi caso fue cambiar el elemento de
Reference
en el archivo del proyecto para que
Version=3.0.0.0
sea ahora
Version=3.0.0.1
.
También actualicé el archivo
System.Web.Mvc.dll
que se encuentra en la carpeta
_bin_deployableAssemblies
a la nueva versión y agregué un elemento
HintPath
en el elemento de
Reference
que apunta a dicho dll para que se recupere incluso cuando en GAC todavía tenemos la versión 3.0.0.0.
La parte difícil es no olvidar actualizar la referencia en todos los proyectos que hacen referencia a
System.Web.Mvc
(por ejemplo, incluyendo el proyecto de prueba).
Su sistema de producción debería estar bien ya que la revisión entrega un archivo de configuración ( System.Web.Mvc.dll.config ) en la siguiente carpeta:
%SystemRoot%/assembly/GAC_MSIL/policy.3.0.System.Web.Mvc/3.0.0.1__31bf3856ad364e35
El archivo de configuración contiene una redirección de ensamblaje a la nueva versión, esto anulará todo lo que tenga en su 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>
Siga los consejos de @Guffa para su sistema de compilación, o use nuget para actualizar. Creo que la solución que funciona depende de cómo entregue los binarios MVC a su sistema (ya sea bin deploy o GAC).