CA2133: Los delegados deben enlazarse a métodos con una transparencia coherente

Nombre de tipo

DelegatesMustBindWithConsistentTransparency

Identificador de comprobación

CA2133

Categoría

Microsoft.Security

Cambio problemático

Nota

Esta advertencia solo se aplica al código que está ejecutando CoreCLR (la versión de CLR que es específica de las aplicaciones web de Silverlight).

Causa

Esta advertencia se desencadena en un método que enlaza un delegado que está marcado con SecurityCriticalAttribute a un método que es transparente o que está marcado con SecuritySafeCriticalAttribute. La advertencia también desencadena un método que enlaza un delegado que es transparente o crítico para la seguridad a un método crítico.

Descripción de la regla

Los tipos de delegado y los métodos a los que se enlazan deben tener una transparencia coherente. Los delegados transparentes y críticos para la seguridad solo pueden enlazar con otros métodos transparentes o críticos para la seguridad. De igual forma, los delegados críticos solo pueden enlazar a métodos críticos. Estas reglas de enlace aseguran que el único código que puede invocar un método a través de un delegado también pudiera haber invocado directamente el mismo método. Por ejemplo, las reglas de enlace evitan que el código transparente llame directamente al código crítico a través de un delegado transparente.

Cómo corregir infracciones

Para corregir una infracción de esta advertencia, cambie la transparencia del delegado o del método al que enlaza para que la transparencia de los dos sea equivalente.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Código

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public delegate void TransparentDelegate();

    [SecurityCritical]
    public delegate void CriticalDelegate();

    public class TransparentType
    {
        void DelegateBinder()
        {
            // CA2133 violation - binding a transparent delegate to a critical method
            TransparentDelegate td = new TransparentDelegate(CriticalTarget);

            // CA2133 violation - binding a critical delegate to a transparent method
            CriticalDelegate cd = new CriticalDelegate(TransparentTarget);
        }

        [SecurityCritical]
        void CriticalTarget() { }

        void TransparentTarget() { }
    }
}