validate side net mvc habilitar for debug data custom create attribute asp annotation security .net-4.0 code-access-security

security - side - Cómo heredar de DataAnnotations.ValidationAttribute(aparece SecureCritical en el host de depuración de Visual Studio en.NET 4).



validate model c# (2)

Tengo una biblioteca de clases [AllowPartiallyTrustedCallers] que contiene subtipos de System.DataAnnotations.ValidationAttribute. La biblioteca se usa en los tipos de contrato de los servicios de WCF.

En .NET 2 / 3.5, esto funcionó bien. Sin embargo, desde .NET 4.0, ejecutar un cliente del servicio en el depurador de Visual Studio da como resultado la excepción " Reglas de seguridad de herencia violadas por tipo: ''(mi subtipo de ValidationAttribute)''. Los tipos derivados deben coincidir con la accesibilidad de seguridad del tipo base o ser menos accesible. "(System.TypeLoadException)

El error parece ocurrir solo cuando se cumplen todas las condiciones siguientes:

  1. una subclase de ValidationAttribute está en un ensamblado AllowPartiallyTrustedCallers
  2. la reflexión se usa para verificar el atributo
  3. el proceso de alojamiento de Visual Studio está habilitado (casilla de verificación en Propiedades del proyecto, pestaña Depurar)

Básicamente, en Visual Studio.NET 2010:

  • crear un nuevo proyecto de consola,
  • agregue una referencia a "System.ComponentModel.DataAnnotations" 4.0.0.0,
  • escribe el siguiente código:

.

using System; [assembly: System.Security.AllowPartiallyTrustedCallers()] namespace TestingVaidationAttributeSecurity { public class MyValidationAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute { } [MyValidation] public class FooBar { } class Program { static void Main(string[] args) { Console.WriteLine("ValidationAttribute IsCritical: {0}", typeof(System.ComponentModel.DataAnnotations.ValidationAttribute).IsSecurityCritical); FooBar fb = new FooBar(); fb.GetType().GetCustomAttributes(true); Console.WriteLine("Press enter to end."); Console.ReadLine(); } } }

  • Presiona F5 y obtienes la excepción!

Presione Ctrl-F5 (inicio sin depuración), y todo funciona bien sin excepción ...

Lo extraño es que ValidationAttribute será o no será crítico en función de la forma en que ejecute el programa (F5 o Ctrl + F5). Como lo ilustra Console.WriteLine en el código anterior. Pero, de nuevo, esto parece suceder con otros atributos (¿y tipos?) También.

Ahora las preguntas ...

¿Por qué tengo este comportamiento al heredar de ValidationAttribute, pero no cuando heredo de System.Attribute? (Usando Reflector no encuentro ajustes especiales en la clase ValidationAttribute o su ensamblaje)

¿Y qué puedo hacer para resolver esto? ¿Cómo puedo mantener MyValidationAttribute heredando de ValidationAttribute en un ensamblado AllowPartiallyTrustedCallers sin marcarlo como SecurityCritical, aún usando el nuevo modelo de seguridad .NET 4 nivel 2 y aún así hacerlo funcionar usando el host de depuración de VS.NET (u otros hosts)?

¡Muchas gracias! Rudi


¿Por qué tengo este comportamiento al heredar de ValidationAttribute, pero no cuando heredo de System.Attribute? (Usando Reflector no encuentro ajustes especiales en la clase ValidationAttribute o su ensamblaje)

Esto se debe a que el ensamblado System.ComponentModel.DataAnnotations es condicionalmente APTCA, es decir, está marcado con el siguiente atributo.

[assembly: AllowPartiallyTrustedCallers(PartialTrustVisibilityLevel = PartialTrustVisibilityLevel.NotVisibleByDefault)]

Algo sobre la forma en que Visual Studio inicia el proceso de host hace que CLR no respete APTCA en este ensamblado aunque el AppDomain predeterminado sea completamente confiable. Esto implica que todos los tipos y métodos en el ensamblaje DataAnnotations son SecurityCritical. Dado que un tipo transparente de seguridad (MyValidationAttribute) no puede heredar de un tipo de seguridad crítica (ValidationAttribute), se lanza esta excepción.

¿Y qué puedo hacer para resolver esto? ¿Cómo puedo mantener MyValidationAttribute heredando de ValidationAttribute en un ensamblado AllowPartiallyTrustedCallers sin marcarlo como SecurityCritical, aún usando el nuevo modelo de seguridad .NET 4 nivel 2 y aún así hacerlo funcionar usando el host de depuración de VS.NET (u otros hosts)?

Parece que esto es un error con el host VS, lo cual es desafortunado para su situación. Por otro lado, debes estar seguro de que quieres que tu ensamblaje sea APTCA. Si es necesario, entonces tienes un par de opciones.

  • Puede abandonar su ensamblaje como está. Esto es ventajoso porque en el entorno de confianza parcial más típico, ASP.NET, el ensamblado de Anotaciones de datos siempre se considerará APTCA. Por supuesto, pierde la capacidad de usar el depurador en el proceso de alojamiento VS.
  • También puede marcar su conjunto C-APTCA. Podrá utilizar el depurador en el proceso de alojamiento VS, pero los consumidores de su ensamblado en ASP.NET necesitarán agregar su ensamblaje al elemento <partialTrustVisibleAssemblies> en el web.config para que sea APTCA.
  • Puede hacer su atributo SecurityCritical, por lo que podrá usar el depurador y no requerirá ninguna configuración especial en ASP.NET, pero todas las clases que usan su atributo también deben ser críticas.

Por alguna razón, el sitio publicó el texto en una pregunta completamente diferente de la que estaba en la página cuando escribía, raro.