CA2141: прозрачные методы не должны удовлетворять требования LinkDemand

Товар Значение
Идентификатор правила CA2141
Категория Microsoft.Security
Критическое изменение Критическое

Причина

Прозрачный метод безопасности вызывает метод в сборке, которая не помечена AllowPartiallyTrustedCallersAttribute атрибутом APTCA, или прозрачный метод безопасности удовлетворяет SecurityAction.LinkDemand типу или методу.

Примечание.

Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".

Описание правила

Удовлетворение LinkDemand — это конфиденциальная операция безопасности, которая может вызвать непреднамеренное повышение привилегий. Прозрачный код безопасности не должен соответствовать LinkDemands, так как он не соответствует тем же требованиям аудита безопасности, что и критически важный код безопасности. Прозрачные методы в сборках набора правил безопасности уровня 1 приводят ко всем сборкам LinkDemands, которые они удовлетворяют, преобразуются в полные требования во время выполнения, что может привести к проблемам с производительностью. В сборках набора правил безопасности 2 прозрачные методы не смогут компилироваться в JIT-компиляторе, если они пытаются удовлетворить LinkDemand.

В сборках, использующих безопасность уровня 2, попытки прозрачного метода безопасности для удовлетворения LinkDemand или вызова метода в сборке, отличной от APTCA, вызывают MethodAccessExceptionзначение; в сборках уровня 1 LinkDemand становится полным спросом.

Устранение нарушений

Чтобы устранить нарушение этого правила, пометьте метод доступа с SecurityCriticalAttribute помощью атрибута или SecuritySafeCriticalAttribute удалите LinkDemand из доступного метода.

Когда лучше отключить предупреждения

Для этого правила отключать вывод предупреждений не следует.

Пример

В этом примере прозрачный метод пытается вызвать метод, имеющий LinkDemand. Это правило будет запускаться в этом коде.

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