Share via


CA2141: Transparente Methoden dürfen keine LinkDemands erfüllen

Element Wert
RuleId CA2141
Category Microsoft.Security
Unterbrechende Änderung Breaking

Ursache

Eine sicherheitstransparente Methode ruft eine Methode in einer Assembly auf, die nicht mit dem AllowPartiallyTrustedCallersAttribute-Attribut (APTCA) markiert ist, oder eine sicherheitstransparente Methode erfüllt einen SecurityAction.LinkDemand für einen Typ oder eine Methode.

Hinweis

Diese Regel wurde als veraltet markiert. Weitere Informationen finden Sie unter Veraltete Regeln.

Regelbeschreibung

Eine LinkDemand-Erfüllung ist ein sicherheitsrelevanter Vorgang, der zu einer unbeabsichtigten Rechteerweiterung führen kann. Sicherheitstransparenter Code darf keine LinkDemands erfüllen, da er nicht den gleichen Anforderungen hinsichtlich der Sicherheitsüberprüfung unterliegt wie sicherheitskritischer Code. Transparente Methoden in Assemblys gemäß Sicherheitsregelsatz der Stufe 1 führen dazu, dass alle durch sie erfüllten LinkDemands zur Laufzeit in vollständige Anforderungen umgewandelt werden, was zu Leistungsproblemen führen kann. In Assemblys gemäß Sicherheitsregelsatz der Stufe 2 können transparente Methoden im JIT-Compiler (Just-in-Time) nicht kompiliert werden, wenn sie versuchen, einen LinkDemand zu erfüllen.

In Assemblys mit Verwendung der Sicherheitsstufe 2 löst der Versuch einer sicherheitstransparenten Methode, einen LinkDemand zu erfüllen oder eine Methode in einer Nicht-APTCA-Assembly aufzurufen, eine MethodAccessException aus. In Assemblys der Sicherheitsstufe 1 wird der LinkDemand zu einer vollständigen Anforderung.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, markieren Sie die aufrufende Methode mit dem Attribut SecurityCriticalAttribute oder SecuritySafeCriticalAttribute, oder entfernen Sie den LinkDemand aus der aufgerufenen Methode.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

In diesem Beispiel ruft eine transparente Methode eine Methode auf, die einen LinkDemand umfasst. Der Code führt zur Auslösung dieser Regel.

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();
        }
    }
}