2010-04-22 5 views
7

Tengo una biblioteca de clases [AllowPartiallyTrustedCallers] que contiene subtipos de System.DataAnntions.ValidationAttribute. La biblioteca se usa en tipos de contrato de servicios de WCF.Cómo heredar de DataAnnotations.ValidationAttribute (aparece SecureCritical en el host de depuración de Visual Studio en .NET 4)

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 "Las reglas de seguridad de herencia violadas por tipo: '(mi subtipo de ValidationAttribute)'. Los tipos derivados deben coincidir con la accesibilidad de seguridad de la base tipo o sea menos accesible "(System.TypeLoadException)

el error aparece a occure sólo cuando todas las siguientes condiciones:.

  1. una subclase de ValidationAttribute es en un ensamblaje 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 las propiedades del proyecto, ficha Depurar)

Así que, básicamente, en Visual Studio.NET 2010:

  • crear un nuevo proyecto de consola,
  • añadir una referencia a "System.ComponentModel.DataAnnotations" 4.0.0.0,
  • escribir 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(); 
     } 
    } 
} 
  • Presione F5 y se obtiene la excepción!

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

Lo extraño es que el ValidationAttribute será o no será securitycritical dependiendo de la forma en que se ejecuta 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 cuando heredando de ValidationAttribute, pero no cuando la herencia de System.Attribute? (Usando Reflector no encuentro ajustes especiales en la clase ValidationAttribute o su ensamble)

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

¡Muchas gracias! Rudi

Respuesta

3

¿Por qué tengo este comportamiento cuando heredando de ValidationAttribute, pero no cuando la herencia de System.Attribute? (El uso del reflector no encuentro configuraciones especiales en la clase ValidationAttribute o de la Asamblea)

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

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

Algo en el modo Visual Studio se inicia el proceso de host hace que el CLR no respetar APTCA en esta asamblea a pesar de que el dominio de aplicación por defecto es de plena confianza. 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 solucionar 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 se trata de un error con el host VS, lo que 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 dejar su ensamblaje como está. Esto es ventajoso porque en el entorno de confianza parcial más típico, ASP.NET, el ensamblaje 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.
1

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.

+0

¿Qué tiene que ver IIS con algo? Esta es una aplicación de consola. –

Cuestiones relacionadas