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. }