SYSLIB0003. Безопасность доступа к коду не поддерживается

Устаревшая технология управления доступом для кода более не поддерживается. Инфраструктура, позволяющая включать управление доступом для кода, существует только в .NET Framework версий с 2.x по 4.x, является устаревшей и больше не получает служебные исправления и исправления системы безопасности.

В связи с этим, начиная с .NET 5, большинство типов, связанных с управлением доступом для кода (CAS) в .NET, являются устаревшими. К ним относятся атрибуты управления доступом для кода, такие как SecurityPermissionAttribute, объекты разрешений CAS, например SocketPermission, производные от EvidenceBase типы, а также другие вспомогательные API. При использовании этих API во время компиляции создается предупреждение SYSLIB0003.

Полный список устаревших API управления доступом для кода приведен ниже:

Методы обхода проблемы

  • Если вы утверждаете любое разрешение безопасности, удалите атрибут или вызов, который утверждает это разрешение.

    // REMOVE the attribute below.
    [SecurityPermission(SecurityAction.Assert, ControlThread = true)]
    public void DoSomething()
    {
    }
    public void DoAssert()
    {
        // REMOVE the line below.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Assert();
    }
    
  • Если вы запрещаете или ограничиваете любое разрешение (с помощью PermitOnly), обратитесь к своему консультанту по безопасности. Поскольку в .NET 5 и более поздних версий атрибуты CAS не учитываются средой выполнения, в системе безопасности вашего приложения может возникнуть брешь, связанная с неправильным использованием инфраструктуры CAS для ограничения доступа к этим методам.

    // REVIEW the attribute below; could indicate security vulnerability.
    [SecurityPermission(SecurityAction.Deny, ControlThread = true)]
    public void DoSomething()
    {
    }
    public void DoPermitOnly()
    {
        // REVIEW the line below; could indicate security vulnerability.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).PermitOnly();
    }
    
  • Если вам требуются какие-либо разрешения (кроме PrincipalPermission), удалите требование. Все требования будут исполнены во время выполнения.

    // REMOVE the attribute below; it will always succeed.
    [SecurityPermission(SecurityAction.Demand, ControlThread = true)]
    public void DoSomething()
    {
    }
    public void DoDemand()
    {
        // REMOVE the line below; it will always succeed.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Demand();
    }
    
  • Если вы требуете PrincipalPermission, обратитесь к руководству по SYSLIB0002: PrincipalPermissionAttribute устарел. Это руководство применимо как для PrincipalPermission, так и для PrincipalPermissionAttribute.

Отключение предупреждений

Если необходимо использовать устаревшие API, вы можете отключить предупреждение в коде или в файле проекта.

Чтобы отключить только одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить предупреждение.

// Disable the warning.
#pragma warning disable SYSLIB0003

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0003

Чтобы отключить все SYSLIB0003 предупреждения в проекте, добавьте <NoWarn> свойство в файл проекта.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0003</NoWarn>
  </PropertyGroup>
</Project>

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

См. также