Saya membaca dari beberapa sumber (buku dan jawaban SO) tentang otorisasi di WebApi.
Misalkan saya ingin menambahkan Atribut Khusus yang memungkinkan akses hanya untuk Pengguna Tertentu:
Kasus 1
Saya telah melihat pendekatan overriding ini OnAuthorization
, yang menetapkan respons jika ada yang salah
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if ( /*check if user OK or not*/)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
}
}
Kasus # 2
Tetapi saya juga melihat contoh serupa ini yang juga menimpa OnAuthorization
tetapi dengan panggilan ke base
:
public override void OnAuthorization(HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
// If not authorized at all, don't bother
if (actionContext.Response == null)
{
//...
}
}
Kemudian, Anda memeriksa apakah
HttpActionContext.Response
sudah diatur atau tidak. Jika tidak disetel, itu berarti permintaan tersebut diotorisasi dan pengguna baik-baik saja
Kasus # 3
Tetapi saya juga telah melihat pendekatan pengesampingan ini IsAuthorized
:
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext context)
{
if ( /*check if user OK or not*/)
{
return true;// or false
}
}
}
Kasus # 4
Dan kemudian saya melihat contoh serupa tetapi dengan call base.IsAuthorized (konteks):
protected override bool IsAuthorized(HttpActionContext context)
{
if (something1 && something2 && base.IsAuthorized(context)) //??
return true;
return false;
}
Satu hal lagi
Dan akhirnya Dominick berkata di sini :
Anda tidak boleh mengganti OnAuthorization - karena Anda akan kehilangan penanganan [AllowAnonymous].
Pertanyaan
1) Metode apa yang harus saya gunakan:
IsAuthorized
atauOnAuthorization
? (atau kapan harus menggunakan yang mana)2) kapan saya harus memanggil
base.IsAuthorized or
base.OnAuthorization`?3) Apakah ini cara mereka membangunnya? bahwa jika responsnya nol maka semuanya baik-baik saja? (kasus # 2)
NB
Harap perhatikan, saya menggunakan (dan ingin menggunakan) hanya AuthorizeAttribute
yang sudah mewarisi dari AuthorizationFilterAttribute
Kenapa?
Karena saya berada di tahap pertama dalam: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
Pokoknya saya bertanya melalui memperluas atribut Otorisasi.
sumber
Jawaban:
Anda akan memperpanjang
AuthorizationFilterAttribute
jika logika otorisasi Anda tidak bergantung pada identitas dan peran yang ditetapkan. Untuk otorisasi terkait pengguna, Anda akan memperpanjang dan menggunakanAuthorizeAttribute
. Untuk kasus sebelumnya, Anda akan menimpaOnAuthorization
. Untuk kasus terakhir, Anda akan menimpaIsAuthorized
. Seperti yang Anda lihat dari kode sumber atribut ini,OnAuthorization
ditandai virtual untuk Anda timpa jika Anda berasal dariAuthorizationFilterAttribute
. Di sisi lain,IsAuthorized
metode ini ditandai sebagai virtual inAuthorizeAttribute
. Saya yakin ini adalah penunjuk yang baik untuk penggunaan yang dimaksudkan.Jawaban atas pertanyaan ini terletak pada cara kerja OO secara umum. Jika Anda mengganti metode, Anda dapat sepenuhnya memberikan implementasi baru atau mendukung implementasi yang disediakan oleh induk dan menyempurnakan perilakunya. Misalnya, ambil kasus
IsAuthorized(HttpActionContext)
. Perilaku kelas dasar adalah untuk memeriksa pengguna / peran terhadap apa yang ditentukan dalam filter vs identitas yang ditetapkan. Katakanlah, Anda ingin melakukan semua itu tetapi sebagai tambahan, Anda ingin memeriksa sesuatu yang lain, mungkin berdasarkan header permintaan atau sesuatu. Jika demikian, Anda dapat memberikan penggantian seperti ini.Saya minta maaf, tapi tidak mengerti Q3 Anda. BTW, filter Otorisasi telah ada sejak lama dan orang menggunakannya untuk segala macam hal dan terkadang juga salah.
Orang yang mengatakan itu adalah Dewa kendali akses - Dominick. Jelas itu akan benar. Jika Anda melihat implementasi
OnAuthorization
(disalin di bawah),panggilan ke
SkipAuthorization
adalah bagian yang memastikanAllowAnonymous
filter diterapkan, yaitu, otorisasi dilewati. Jika Anda mengesampingkan metode ini, Anda kehilangan perilaku itu. Sebenarnya, jika Anda memutuskan untuk mendasarkan otorisasi Anda pada pengguna / peran, pada saat itu Anda akan memutuskan untuk mendapatkannyaAuthorizeAttribute
. Hanya opsi yang benar yang tersisa untuk Anda pada saat itu yang akan menimpaIsAuthorized
dan bukan yang sudah digantiOnAuthorization
, meskipun secara teknis dimungkinkan untuk melakukannya.PS. Di ASP.NET Web API, ada filter lain yang disebut filter otentikasi. Idenya adalah Anda menggunakannya untuk otentikasi dan otorisasi filter untuk otorisasi, seperti namanya. Namun, ada banyak contoh di mana batasan ini dipalsukan. Banyak contoh filter authroization akan melakukan semacam otentikasi. Bagaimanapun, jika Anda punya waktu dan ingin memahami lebih banyak, lihat artikel MSDN ini . Penafian: Itu ditulis oleh saya.
sumber
OnAuthorization
di buku saya. Saya yakin saya tidak akan menulis tentang memeriksa tanggapan untuk null, karena ini adalah pertama kalinya saya mendengarnya :)Oke, saran saya adalah melakukan hal berikut dengan asumsi bahwa Anda menggunakan token pembawa OAuth untuk melindungi API Web Anda dan Anda menyetel allowTime sebagai klaim untuk pengguna saat Anda mengeluarkan token. Anda dapat membaca lebih lanjut tentang otentikasi berbasis token di sini
ganti metode
OnAuthorizationAsync
dan gunakan kode contoh di bawah ini:sumber
AuthorizeAttribute
yang mewarisiAuthorizationFilterAttribute
dan -juga untuk belajar saya secara khusus bertanya tentang metode mana yang harus saya gunakan dan tentang Respon memiliki konten atau tidak ...ASP.NET v5 Memperkenalkan Sistem Otorisasi yang benar-benar baru. Bagi mereka yang akan Menggunakan NET 5 saya sarankan pindah ke Microsoft.AspNet.Authorization.
Cukup banyak itu menyelesaikan kekacauan yang disebabkan oleh menjaga keduanya
System.Web.Http.Authorize
danSystem.Web.Mvc.Authorize
dan implementasi otentikasi lama lainnya.Ini memberikan abstraksi yang sangat baik dari Jenis Tindakan (Buat, Baca, Perbarui, Hapus), Sumber Daya, Peran, Klaim, Tampilan, Persyaratan Kustom dan memungkinkan untuk membangun Penangan kustom, menggabungkan salah satu dari yang di atas. Selain itu, penangan tersebut juga dapat digunakan dalam kombinasi.
sumber