c# - net - autofac documentation
.NET 4, atributo AllowPartiallyTrustedCallers, y marcas de seguridad como SecurityCritical (1)
Usted tiene razón: en .NET 4, dejar el APTCA allí hace que el ensamblaje sea SecurityTransparent, y eso puede ser lo que le cause dolor.
El artículo de MSDN Migración de un ensamblaje APTCA a .NET Framework 4 tiene una buena discusión y explicación de los cambios en el atributo AllowCartiallyTrustedCallersAttribute en .NET 4.
Específicamente:
El atributo AllowPartiallyTrustedCallers ha cambiado. En v4, ya no tiene nada que ver con las demandas de enlaces. De hecho, la demanda de enlaces implícita que estaba presente en las bibliotecas firmadas en v2 se ha ido. En su lugar, todos los ensamblajes totalmente confiables en v4 son, por defecto, SecurityCritical.
[recorte /]
En v4, el efecto de APTCA es eliminar el comportamiento automático de SecurityCritical del ensamblaje al que se aplica.
Y...
Debido a que el atributo AllowPartiallyTrustedCallers hace que todo el ensamblaje sea SecurityTransparent de forma predeterminada, el autor del ensamblado debe marcar específicamente los métodos que necesitan realizar operaciones privilegiadas como SecurityCritical o SecuritySafeCritical.
(Es realmente un buen artículo con el que el autor Mike Rousos hizo un gran trabajo. Le animo a que lo lea en su totalidad ) .
Si está iniciando una nueva biblioteca .NET 4, probablemente sea mejor quedarse con el modelo de seguridad .NET 4 y usar los atributos apropiados de SecurityCritical, SecuritySafeCritical y SecurityTransparent donde sea necesario. Son mucho más fáciles de administrar y entender que la seguridad de acceso al código antiguo.
Si está migrando una biblioteca antigua al nuevo modelo, hay un buen ejemplo en el artículo sobre cómo hacerlo ... pero básicamente equivale a eliminar los antiguos LinkDemands y agregar [SecurityCritical] en su lugar.
En su caso particular, la forma más rápida de comenzar sería agregar el atributo SecurityRules para obtener el comportamiento anterior, pero no estoy seguro de que lo considere de la manera correcta . La forma correcta probablemente sería perder el APTCA y agregar SecurityCritical en el ensamblaje porque el ensamblaje puede contener el código SecurityCritical , luego marcar los diversos tipos que llaman el código SecurityCritical (por ejemplo, cosas que hacen referencia a GetObjectData) con SecuritySafeCritical para que su código SecurityTransparent pueda llamarlo . Por supuesto, ese segundo enfoque será mucho más trabajo, por lo que probablemente querrá ejecutar SecAnnotate.exe y obtener algunos consejos automatizados.
Al buscar en el tronco Moq, una búsqueda de GetObjectData muestra que el método en cuestión es la anulación de un mecanismo de serialización excepcional (ISerializable.GetObjectData en System.Exception), al que solo llamará el código SecurityCritical, por lo que es posible que ni siquiera se encuentre con Cualquier problema si simplemente pierde APTCA y marca el ensamblado SecurityCritical.
Hay un problema archivado en Autofac para actualizarlo al último modelo de seguridad. Si te gusta la idea, vota / comenta.
Lo siento, no fue una respuesta corta. La seguridad, desafortunadamente, nunca es fácil. : S
Soy nuevo C # y estoy tratando de entender las nuevas características de seguridad de .NET-4 .
Para completar algunos detalles, actualmente estoy intentando actualizar AutofacContrib.Moq para que funcione con la última versión de Moq. No tuve problemas para hacer esto para .NET-3.5 y menores. Pero en .NET-4, las restricciones de seguridad dan como resultado numerosas excepciones de seguridad.
Moq tiene un método único, GetObjectData
, que está marcado con el atributo SecurityCritical . AutofacContrib.Moq tiene el AllowPartiallyTrustedCallers atributos AllowPartiallyTrustedCallers , que es la fuente de las excepciones. Parece que en lugar de agregar el atributo SecurityRules
con un nivel de seguridad de 1, sería mejor que eliminara el atributo AllowPartiallyTrustedCallers
. Creo que esto hace que el ensamblaje sea SecurityTransparent por defecto, lo que puede no ser suficiente (aunque las pruebas de la unidad AutofacContrib.Moq pasan).
Mi pregunta principal en este momento es si los ensamblados dirigidos a .NET-4 deberían usar el atributo AllowPartiallyTrustedCallers. Pero, dado que definitivamente no entiendo todo todavía, ¿qué detalles se deben considerar cuando se trabaja con ensamblajes que están marcados con seguridad? ¿Debo marcar explícitamente mi ensamblaje con atributos de seguridad en esos lugares que usa, directa o indirectamente, algo que está marcado como SecurityCritical
?