Saya ingin menambahkan Otorisasi ke pengontrol, untuk beberapa Peran sekaligus.
Biasanya akan terlihat seperti ini:
[Authorize(Roles = "RoleA,RoleB,RoleC")]
public async Task<ActionResult> Index()
{
}
Tapi saya telah menyimpan Peran saya dalam konstanta, karena mereka mungkin berubah atau diperpanjang di beberapa titik.
public const RoleA = "RoleA";
public const RoleB = "RoleB";
public const RoleC = "RoleC";
Saya tidak dapat melakukan ini, karena string harus diketahui pada waktu kompilasi:
[Authorize(Roles = string.join(",",RoleA,RoleB,RoleC)]
public async Task<ActionResult> Index()
{
}
Apakah ada cara untuk menghindari masalah tersebut?
Saya BISA menulis const yang hanya berisi "RoleA, RoleB, RoleC" - tetapi saya tidak suka string ajaib dan ini adalah string ajaib. Mengubah nama Role dan lupa mengganti string gabungan akan menjadi bencana.
Saya menggunakan MVC5. Identitas ASP.NET dan Peran diketahui pada waktu kompilasi.
c#
asp.net-mvc
authorization
Christian Sauer
sumber
sumber
Jawaban:
Coba buat atribut otorisasi khusus seperti ini .
Dengan asumsi peran Anda akan sama untuk beberapa pengontrol, buat kelas helper:
Kemudian gunakan seperti ini:
sumber
Pastikan Anda menonaktifkan kelas atribut khusus
System.Web.Mvc.AuthorizeAttribute
dan BUKANSystem.Web.Http.AuthorizeAttribute
.Saya mengalami masalah yang sama. Setelah saya mengubahnya, semuanya bekerja.
Anda mungkin juga ingin menambahkan yang berikut ini ke kelas atribut khusus Anda:
sumber
System.Web.Http.AuthorizeAttribute
BUKAN DARISystem.Web.Mvc.AuthorizeAttribute
Cara terbaik dan termudah yang saya temukan untuk menyelesaikan masalah ini adalah dengan menggabungkan peran di atribut Otorisasi.
dengan CustomRole kelas dengan string konstan seperti ini:
sumber
Apa yang saya lakukan adalah jawabannya di @Tieson
Saya mengubah sedikit dalam jawabannya. Alih-alih string. Bergabunglah mengapa tidak mengubahnya menjadi daftar?
Inilah jawaban saya:
Lalu periksa apakah peran tersebut valid menggantikan OnAuthorization
Dan begitulah, sekarang memvalidasi apakah peran tersebut berwenang untuk mengakses sumber daya
sumber
Saya merasa bahwa atribut otorisasi khusus berlebihan untuk masalah ini kecuali Anda memiliki banyak peran.
Karena string harus diketahui pada waktu kompilasi, mengapa tidak membuat kelas Peran statis yang berisi string publik dari peran yang telah Anda tetapkan, lalu tambahkan string yang dipisahkan koma dengan peran tertentu yang ingin Anda otorisasi:
Dan kemudian Anda dapat menggunakan Atribut Otorisasi seperti pada Kelas Pengontrol atau Metode Pengontrol (atau keduanya):
sumber
ADMIN_OR_VIEWER
peran dalam tindakan itu mubazir karena Anda tidak akan diizinkan untuk masuk keCreate
metode jika Anda belum memilikiADMIN
peran tersebut. Dalam hal iniVIEWER
tidak akan pernah bisa memanggilCreate
metode.