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 étant SecurityTransparentAttribute ne bénéficie pas des 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-critique et signale toutes les utilisations déclaratives ou impératives de Assert.This rule analyzes all methods and types in an assembly which is 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 provoquera 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 % et également dans les assemblys mixtes/mi-critique où une méthode ou un type est déclaré transparent, mais inclut une assertion utilisations 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.NET Framework 2.0 a introduit une fonctionnalité nommée transparence.The .NET Framework.NET Framework 2.0 introduced a feature named transparency. Types, 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.

Le code transparent ne peut pas é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 la SecurityCriticalAttribute, ou supprimez l’assertion.To resolve the issue, either mark the code which calls the Assert with the SecurityCriticalAttribute, or remove the Assert.

Quand supprimer les avertissementsWhen to Suppress Warnings

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

ExempleExample

Ce code échoue si SecurityTestClass est transparent, lorsque la Assert méthode lève une exception 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écurisée pour l’élévation, la marquer comme avec critique sécurisée Ceci nécessite qu’une sécurité détaillée, complet et sans erreur audit doit être effectué sur la méthode, ainsi que toutes les légendes qui se produisent dans la méthode de l’assertion :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 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 à partir du code et permettent de n’importe quel fichier flux de demandes d’autorisation d’e/s au-delà comme à l’appelant.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 généralement nécessaire, car les demandes d’autorisation seront acheminées vers l’appelant et/ou le domaine d’application.In this case, no security audit is generally 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é, d’environnement et du 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