Поделиться через


PrincipalPermissionAttribute устарел и является ошибочным

Конструктор PrincipalPermissionAttribute устарел и вызывает ошибку времени компиляции. Нельзя создать экземпляр этого атрибута или применить его к методу.

Описание изменения

В .NET Framework и .NET Core можно добавлять заметки к методам с помощью атрибута PrincipalPermissionAttribute. Например:

[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
public void MyMethod()
{
    // Code that should only run when the current user is an administrator.
}

Начиная с .NET 5 к методу нельзя применить атрибут PrincipalPermissionAttribute. Конструктор атрибута устарел и вызывает ошибку во время компиляции. В отличие от других устаревших предупреждений, эту ошибку нельзя обойти.

Причина изменения

Тип PrincipalPermissionAttribute, как и другие типы, являющиеся подклассом SecurityAttribute, является частью инфраструктуры .NET по управлению доступом для кода (CAS). В .NET Framework 2.x-4.x среда выполнения применяет заметки PrincipalPermissionAttribute к записи метода, даже если приложение выполняется с полным доверием. В .NET Core и .NET 5 и более поздних версий не поддерживаются атрибуты CAS, и среда выполнения их игнорирует.

Это различие в поведении .NET Framework по отношению к .NET Core и .NET 5 может привести к ситуации "ошибочного открытия", когда доступ должен быть заблокирован, а вместо этого он был разрешен. Чтобы не допустить ситуации "ошибочного открытия", больше нельзя применять этот атрибут в коде, предназначенном для .NET 5 и более поздних версий.

Представленные версии

5,0

При возникновении ошибки устаревшего атрибута необходимо выполнить определенные действия.

  • При применении атрибута к методу действия MVC ASP.NET:

    Рассмотрите возможность использования встроенной инфраструктуры авторизации ASP.NET. В следующем примере кода показано, как добавить к контроллеру атрибут AuthorizeAttribute. Среда выполнения ASP.NET выполнит авторизацию пользователя перед выполнением действия.

    using Microsoft.AspNetCore.Authorization;
    
    namespace MySampleApp
    {
        [Authorize(Roles = "Administrator")]
        public class AdministrationController : Controller
        {
            public ActionResult MyAction()
            {
                // This code won't run unless the current user
                // is in the 'Administrator' role.
            }
        }
    }
    

    Дополнительные сведения см. в статьях Авторизация на основе ролей в ASP.NET Core и Общие сведения об авторизации в ASP.NET Core.

  • При применении атрибута к коду библиотеки вне контекста веб-приложения:

    Выполните проверки вручную в начале метода. Это можно сделать с помощью метода IPrincipal.IsInRole(String).

    using System.Threading;
    
    void DoSomething()
    {
        if (Thread.CurrentPrincipal == null
            || !Thread.CurrentPrincipal.IsInRole("Administrators"))
        {
            throw new Exception("User is anonymous or isn't an admin.");
        }
    
        // Code that should run only when user is an administrator.
    }
    

Затронутые API