Saya memiliki situs MVC webapi yang menggunakan otentikasi OAuth / token untuk mengotentikasi permintaan. Semua pengontrol yang relevan memiliki atribut yang benar, dan otentikasi berfungsi dengan baik.
Masalahnya adalah tidak semua permintaan dapat diotorisasi dalam cakupan atribut - beberapa pemeriksaan otorisasi harus dilakukan dalam kode yang dipanggil oleh metode pengontrol - apa cara yang benar untuk mengembalikan respons 401 tidak sah dalam kasus ini?
Saya telah mencoba throw new HttpException(401, "Unauthorized access");
, tetapi ketika saya melakukan ini, kode status respons adalah 500 dan saya juga mendapatkan jejak tumpukan. Bahkan dalam pendataan DelegatingHandler, kita dapat melihat bahwa responnya adalah 500, bukan 401.
c#
asp.net-mvc
authorization
GoatInTheMachine
sumber
sumber
HttpResponseException
versus kapan harus mengembalikanUnauthorized()
. Menggunakan pengecualian untuk kesalahan 'yang diharapkan' adalah sedikit anti-pola, jadi jika ada kasus Anda mengharapkan panggilan membuat kesalahan ini, kembaliUnauthorized()
mungkin adalah panggilan yang tepat. SimpanHttpResponseException
untuk hal yang benar-benar tidak terduga.Jawaban:
Anda harus membuang
HttpResponseException
dari metode API Anda, bukanHttpException
:Atau, jika Anda ingin memberikan pesan khusus:
sumber
Kembalikan saja yang berikut ini:
sumber
return Content<string>(HttpStatusCode.Unauthorized, "Message");
untuk melakukan ini.Sebagai alternatif jawaban lain, Anda juga dapat menggunakan kode ini jika Anda ingin mengembalikan
IActionResult
dalam pengontrol ASP.NET.ASP.NET
Pembaruan: ASP.NET Core
Kode di atas tidak berfungsi di ASP.NET Core, Anda dapat menggunakan salah satu dari berikut ini:
Rupanya frasa alasan cukup opsional ( Dapatkah respons HTTP menghilangkan Frase-Alasan? )
sumber
ControllerBase
kelas (digunakan oleh ASP.NET Core WebAPI) tidak lagi memilikiContent
kelebihan beban yang menerima kode status HTTP.HttpStatusCode.Unauthorized
), bukan 200.Content(...)
hanya singkatan untuk mengembalikan konten tertentu dengan kode status HTTP tertentu. Jika Anda ingin mengirim 200 Anda dapat menggunakanOk(...)
Anda mendapatkan kode respon 500 karena Anda melontarkan pengecualian (the
HttpException
) yang menunjukkan beberapa jenis kesalahan server, ini adalah pendekatan yang salah.Cukup atur kode status respons .eg
sumber
Response
properti.Untuk menambah jawaban yang ada di ASP.NET Core> = 1.0 Anda bisa
Untuk meneruskan info ke klien, Anda dapat melakukan panggilan seperti ini:
Pada klien selain respons 401, Anda juga akan mendapatkan data yang diteruskan. Misalnya pada kebanyakan klien Anda bisa
await response.json()
mendapatkannya.sumber
Dalam .Net Core Anda dapat menggunakan
dari pada
yang memiliki keuntungan untuk mengalihkan ke halaman default yang tidak sah (Akun / AccessDenied) daripada memberikan 401 langsung
untuk mengubah lokasi default, ubah startup.cs Anda
sumber
Anda dapat menggunakan kode ikuti di asp.net core 2.0:
sumber
Anda juga mengikuti kode ini:
sumber