Condividi tramite


CA2141:I metodi Transparent non devono soddisfare i LinkDemand

Articolo Valore
ID regola CA2141
Category Microsoft.Security
Modifica Interruzione

Causa

Un metodo transparent per la sicurezza chiama un metodo in un assembly che non è contrassegnato con l'attributo AllowPartiallyTrustedCallersAttribute APTCA o un metodo trasparente per la sicurezza soddisfa un SecurityAction.LinkDemand oggetto per un tipo o un metodo.

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

Soddisfare un LinkDemand è un'operazione sensibile alla sicurezza che può causare l'elevazione involontaria dei privilegi. Il codice trasparente per la sicurezza non deve soddisfare LinkDemands, perché non è soggetto agli stessi requisiti di controllo di sicurezza del codice critico per la sicurezza. I metodi trasparenti negli assembly di livello 1 del set di regole di sicurezza causeranno la conversione di tutti i LinkDemand in richieste complete in fase di esecuzione, che possono causare problemi di prestazioni. Negli assembly di livello 2 del set di regole di sicurezza, i metodi trasparenti non verranno compilati nel compilatore JIT (Just-In-Time) se tentano di soddisfare un LinkDemand.

Negli assembly che usano la sicurezza di livello 2, i tentativi da parte di un metodo trasparente per la sicurezza di soddisfare un LinkDemand o chiamare un metodo in un assembly non APTCA genera un MethodAccessExceptionoggetto . Negli assembly di livello 1 il LinkDemand diventa una richiesta completa.

Come correggere le violazioni

Per correggere una violazione di questa regola, contrassegnare il metodo di accesso con l'attributo SecurityCriticalAttribute o SecuritySafeCriticalAttribute oppure rimuovere LinkDemand dal metodo a cui si accede.

Quando eliminare gli avvisi

Non escludere un avviso da questa regola.

Esempio

In questo esempio un metodo trasparente tenta di chiamare un metodo con linkdemand. Questa regola verrà attivata su questo codice.

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