CA2147 : Les méthodes transparentes ne peuvent pas utiliser d'assertions de sécuritéCA2147: Transparent methods may not use security asserts

TypeNameTypeName SecurityTransparentCodeShouldNotAssertSecurityTransparentCodeShouldNotAssert
CheckIdCheckId CA2147CA2147
CategoryCategory Microsoft.SecurityMicrosoft.Security
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Code qui est marqué comme SecurityTransparentAttribute n’est pas accordé les autorisations suffisantes pour déclarer.Code that is marked as SecurityTransparentAttribute is not granted sufficient permissions to assert.

Description de la règleRule description

Cette règle analyse toutes les méthodes et les types dans un assembly qui est soit 100 % transparent ou mi-transparent mi-critique et elle signale toutes les utilisations déclaratives ou impératives de Assert.This rule analyzes all methods and types in an assembly that's either 100% transparent or mixed transparent/critical, and flags any declarative or imperative usage of Assert.

À l’exécution, tous les appels à Assert à partir du code transparent entraîne un InvalidOperationException levée.At run time, any calls to Assert from transparent code will cause a InvalidOperationException to be thrown. Cela peut se produire dans les deux assemblys transparents de 100 %, ainsi que dans les assemblys mixtes mi-critique où une méthode ou le type est déclaré transparent, mais inclut une assertion déclarative ou impérative.This can occur in both 100% transparent assemblies, and also in mixed transparent/critical assemblies where a method or type is declared transparent, but includes a declarative or imperative Assert.

Le .NET Framework 2.0 a introduit une fonctionnalité nommée transparence.The .NET Framework 2.0 introduced a feature named transparency. Types de champs, interfaces, classes et méthodes individuelles peuvent être transparent ou critique.Individual methods, fields, interfaces, classes, and types can be either transparent or critical.

Code transparent n’est pas autorisé à élever les privilèges de sécurité.Transparent code is not allowed to elevate security privileges. Par conséquent, toutes les autorisations accordées ou sollicitées sont automatiquement transmises via le code pour le domaine d’application appelant ou l’hôte.Therefore, any permissions granted or demanded of it are automatically passed through the code to the caller or host application domain. Exemples d’élévations incluent les assertions, les LinkDemands, l’attribut SuppressUnmanagedCode et unsafe code.Examples of elevations include Asserts, LinkDemands, SuppressUnmanagedCode, and unsafe code.

Comment corriger les violationsHow to fix violations

Pour résoudre ce problème, marquez le code qui appelle la méthode Assert avec le SecurityCriticalAttribute, ou supprimez l’assertion.To resolve the issue, either mark the code that calls the Assert with the SecurityCriticalAttribute, or remove the Assert.

Quand supprimer les avertissementsWhen to suppress warnings

Ne supprimez pas un message à partir de cette règle.Do not suppress a message from this rule.

ExempleExample

Ce code échouera si SecurityTestClass est transparent, lorsque la Assert méthode lève un InvalidOperationException.This code will fail if SecurityTestClass is transparent, when the Assert method throws a InvalidOperationException.

using System;
using System.Security;
using System.Security.Permissions;

namespace TransparencyWarningsDemo
{

    public class TransparentMethodsUseSecurityAssertsClass
    {
        // CA2147 violation - transparent code using a security assert declaratively.  This can be fixed by
        // any of:
        //   1. Make DeclarativeAssert critical
        //   2. Make DeclarativeAssert safe critical
        //   3. Remove the assert attribute
        [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
        public void DeclarativeAssert()
        {
        }

        public void ImperativeAssert()
        {
            // CA2147 violation - transparent code using a security assert imperatively.  This can be fixed by
            // any of:
            //   1. Make ImperativeAssert critical
            //   2. Make ImperativeAssert safe critical
            //   3. Remove the assert call
            new PermissionSet(PermissionState.Unrestricted).Assert();
        }
    }
}

ExempleExample

Une option consiste à la révision du code la méthode comme dans l’exemple ci-dessous et si la méthode est considérée comme sûr pour l’élévation, à la marquer comme avec critique sécurisée.One option is to code review the SecurityTransparentMethod method in the example below, and if the method is considered safe for elevation, mark SecurityTransparentMethod with secure-critical. Cela nécessite qu’un audit de sécurité détaillés, complets et sans erreur doit être effectué sur la méthode ainsi que les légendes qui se produisent dans la méthode de l’assertion :This requires that a detailed, complete, and error-free security audit must be performed on the method together with any call-outs that occur within the method under the Assert:

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        [System.Security.SecurityCritical]
        void SecurityCriticalMethod()
        {
            new FileIOPermission(PermissionState.Unrestricted).Assert();

            // perform I/O operations under Assert
        }
    }
}

Une autre option consiste à supprimer l’assertion du code et permettent de n’importe quel flux de demandes d’autorisation d’e/s au-delà comme à l’appelant de fichier suivante.Another option is to remove the Assert from the code, and let any subsequent file I/O permission demands flow beyond SecurityTransparentMethod to the caller. Cela permet des vérifications de sécurité.This enables security checks. Dans ce cas, aucun audit de sécurité n’est nécessaire, car les demandes d’autorisation circulent à l’appelant et/ou le domaine d’application.In this case, no security audit is needed, because the permission demands will flow to the caller and/or the application domain. Demandes d’autorisation sont étroitement contrôlés via la stratégie de sécurité, environnement d’hébergement et code à la source.Permission demands are closely controlled through security policy, hosting environment, and code-source permission grants.

Voir aussiSee also

Avertissements liés à la sécuritéSecurity Warnings