Partager via


CA2141 : Les méthodes transparentes ne répondent pas aux LinkDemands

Élément Valeur
ID de la règle CA2141
Category Microsoft.Security
Modification avec rupture Rupture

Cause

Une méthode transparente de sécurité appelle une méthode dans un assembly qui n'est pas marqué à l'aide de l'attribut AllowPartiallyTrustedCallersAttribute (APTCA), ou une méthode transparente de sécurité satisfait une SecurityAction.LinkDemand pour un type ou une méthode.

Notes

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

Description de la règle

La satisfaction d’un LinkDemand est une opération de sécurité qui peut provoquer une élévation involontaire des privilèges. Le code transparent de sécurité ne doit pas satisfaire LinkDemands, car il n’est pas soumis aux mêmes exigences d’audit de sécurité que le code critique de sécurité. La présence de méthodes transparentes dans les assemblys de niveau 1 de l’ensemble de règles de sécurité entraînent la conversion de tous les LinkDemands en requêtes complètes au moment de l’exécution, ce qui peut entraîner des problèmes de performances. Dans les assemblys de niveau 2 de la règle de sécurité, les méthodes transparentes ne sont pas compilées dans le compilateur juste-à-temps (JIT) s’ils tentent de satisfaire un LinkDemand.

Dans les assemblys qui utilisent la sécurité de niveau 2, les tentatives effectuées par une méthode transparente de sécurité pour satisfaire un LinkDemand ou appeler une méthode dans un assembly non-APTCA déclenchent une MethodAccessException ; dans les assemblys de niveau 1, linkDemand devient une requête complète.

Comment corriger les violations

Pour corriger une violation de cette règle, marquez la méthode d’accès avec l’attribut SecurityCriticalAttribute ou SecuritySafeCriticalAttribute, ou supprimez LinkDemand de la méthode accessible.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

Dans cet exemple, une méthode transparente tente d’appeler une méthode qui a un LinkDemand. Cette règle se déclenche sur ce code.

using System;
using System.Security.Permissions;


namespace TransparencyWarningsDemo
{

    public class TransparentMethodSatisfiesLinkDemandsClass
    {
        [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
        public void LinkDemandMethod() { }


        public void TransparentMethod()
        {
            // CA2141 violation - transparent method calling a method protected with a link demand.  Any of the
            // following fixes will work here:
            //  1. Make TransparentMethod critical
            //  2. Make TransparentMethod safe critical
            //  3. Remove the LinkDemand from LinkDemandMethod  (In this case, that would be recommended anyway
            //     since it's level 2 -- however you could imagine it in a level 1 assembly)
            LinkDemandMethod();
        }
    }
}