Atrybut PrincipalPermissionAttribute jest przestarzały jako błąd

Konstruktor PrincipalPermissionAttribute jest przestarzały i generuje błąd czasu kompilacji. Nie można utworzyć wystąpienia tego atrybutu ani zastosować go do metody.

Opis zmiany

W programach .NET Framework i .NET Core można dodawać adnotacje do metod za pomocą atrybutu PrincipalPermissionAttribute . Na przykład:

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

Począwszy od platformy .NET 5, nie można zastosować atrybutu PrincipalPermissionAttribute do metody. Konstruktor atrybutu jest przestarzały i generuje błąd czasu kompilacji. W przeciwieństwie do innych ostrzeżeń dotyczących obsoletionu, nie można pominąć błędu.

Przyczyna wprowadzenia zmiany

Typ PrincipalPermissionAttribute , podobnie jak inne typy, które są podklasą SecurityAttribute, jest częścią . Infrastruktura zabezpieczeń dostępu kodu (CAS) platformy NET. W programie .NET Framework 2.x — 4.x środowisko uruchomieniowe wymusza PrincipalPermissionAttribute adnotacje we wpisie metody, nawet jeśli aplikacja jest uruchomiona w scenariuszu pełnego zaufania. Programy .NET Core i .NET 5 i nowsze nie obsługują atrybutów CAS, a środowisko uruchomieniowe je ignoruje.

Ta różnica w zachowaniu programów .NET Framework do .NET Core i .NET 5 może spowodować "niepowodzenie otwarcia", w którym dostęp powinien zostać zablokowany, ale zamiast tego został dozwolony. Aby zapobiec awarii scenariusza otwierania, nie można już zastosować atrybutu w kodzie przeznaczonym dla platformy .NET 5 lub nowszej.

Wprowadzona wersja

5,0

Jeśli wystąpi błąd obsoletion, musisz podjąć akcję.

  • Jeśli stosujesz atrybut do metody akcji MVC ASP.NET:

    Rozważ użycie platformy ASP. Wbudowana infrastruktura autoryzacji platformy NET. Poniższy kod przedstawia sposób dodawania adnotacji do kontrolera za pomocą atrybutu AuthorizeAttribute . Środowisko uruchomieniowe ASP.NET autoryzuje użytkownika przed wykonaniem akcji.

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

    Aby uzyskać więcej informacji, zobacz Autoryzacja oparta na rolach w ASP.NET Core i Wprowadzenie do autoryzacji w ASP.NET Core.

  • Jeśli stosujesz atrybut do kodu biblioteki poza kontekstem aplikacji internetowej:

    Wykonaj testy ręcznie na początku metody. Można to zrobić przy użyciu IPrincipal.IsInRole(String) metody .

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

Dotyczy interfejsów API