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:.
- una subclase de ValidationAttribute es en un ensamblaje AllowPartiallyTrustedCallers
- la reflexión se usa para verificar el atributo
- 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
¿Qué tiene que ver IIS con algo? Esta es una aplicación de consola. –