Bagikan melalui


PrincipalPermissionAttribute usang sebagai kesalahan

PrincipalPermissionAttribute Konstruktor kedaluwarsa dan menghasilkan kesalahan waktu kompilasi. Anda tidak dapat membuat instans atribut ini atau menerapkannya ke metode .

Deskripsi perubahan

Pada .NET Framework dan .NET Core, Anda dapat membuat anotasi metode dengan PrincipalPermissionAttribute atribut . Misalnya:

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

Mulai dari .NET 5, Anda tidak dapat menerapkan atribut ke PrincipalPermissionAttribute metode . Konstruktor untuk atribut usang dan menghasilkan kesalahan waktu kompilasi. Tidak seperti peringatan usang lainnya, Anda tidak dapat menekan kesalahan.

Alasan untuk berubah

Jenisnya PrincipalPermissionAttribute , seperti jenis lain yang subkelas SecurityAttribute, adalah bagian dari . Infrastruktur Code Access Security (CAS) NET. Dalam .NET Framework 2.x - 4.x, runtime memberlakukan PrincipalPermissionAttribute anotasi pada entri metode, bahkan jika aplikasi berjalan di bawah skenario kepercayaan penuh. .NET Core dan .NET 5 dan yang lebih baru tidak mendukung atribut CAS, dan runtime mengabaikannya.

Perbedaan perilaku dari .NET Framework ke .NET Core dan .NET 5 ini dapat mengakibatkan skenario "gagal terbuka", di mana akses seharusnya diblokir tetapi telah diizinkan. Untuk mencegah skenario "fail open", Anda tidak dapat lagi menerapkan atribut dalam kode yang menargetkan .NET 5 atau yang lebih baru.

Versi yang diperkenalkan

5.0

Jika Anda mengalami kesalahan usang, Anda harus mengambil tindakan.

  • Jika Anda menerapkan atribut ke metode tindakan MVC ASP.NET:

    Pertimbangkan untuk menggunakan ASP. Infrastruktur otorisasi bawaan NET. Kode berikut menunjukkan cara membuat anotasi pengontrol dengan AuthorizeAttribute atribut . Runtime ASP.NET akan mengotorisasi pengguna sebelum melakukan tindakan.

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

    Untuk informasi selengkapnya, lihat Otorisasi berbasis peran di ASP.NET Core dan Pengenalan otorisasi di ASP.NET Core.

  • Jika Anda menerapkan atribut ke kode pustaka di luar konteks aplikasi web:

    Lakukan pemeriksaan secara manual di awal metode Anda. Ini dapat dilakukan dengan menggunakan IPrincipal.IsInRole(String) metode .

    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 yang Terpengaruh