Bagaimana cara mengkonfigurasi proyek mvc / webapi saya sehingga metode webapi yang dipanggil dari tampilan silet tidak mengembalikan halaman login saat itu tidak sah?
Ini adalah aplikasi MVC5 yang juga memiliki pengontrol WebApi untuk panggilan melalui javascript.
Dua metode di bawah ini
[Route("api/home/LatestProblems")]
[HttpGet()]
public List<vmLatestProblems> LatestProblems()
{
// Something here
}
[Route("api/home/myLatestProblems")]
[HttpGet()]
[Authorize(Roles = "Member")]
public List<vmLatestProblems> mylatestproblems()
{
// Something there
}
dipanggil melalui kode sudut berikut:
angular.module('appWorship').controller('latest',
['$scope', '$http', function ($scope,$http) {
var urlBase = baseurl + '/api/home/LatestProblems';
$http.get(urlBase).success(function (data) {
$scope.data = data;
}).error(function (data) {
console.log(data);
});
$http.get(baseurl + '/api/home/mylatestproblems')
.success(function (data) {
$scope.data2 = data;
}).error(function (data) {
console.log(data);
});
}]
);
Jadi saya tidak masuk dan metode pertama berhasil mengembalikan data. metode kedua mengembalikan (dalam fungsi keberhasilan) data yang berisi setara dengan halaman login. yaitu apa yang akan Anda dapatkan di MVC jika Anda meminta tindakan pengontrol yang dicap dengan [Otorisasi] dan Anda tidak masuk.
Saya ingin mengembalikan 401 tanpa izin, sehingga saya dapat menampilkan data yang berbeda untuk pengguna berdasarkan apakah mereka masuk atau tidak. Idealnya jika pengguna login saya ingin dapat mengakses properti Pengguna Pengendali sehingga saya dapat mengembalikan data khusus untuk Anggota itu.
PEMBARUAN: Karena tidak ada saran di bawah ini yang tampaknya berfungsi lagi (perubahan pada Identity atau WebAPI) ive membuat contoh mentah tentang github yang seharusnya menggambarkan masalah tersebut.
Brock Allen memiliki posting blog yang bagus tentang cara mengembalikan 401 untuk panggilan ajax saat menggunakan otentikasi Cookie dan OWIN. http://brockallen.com/2013/10/27/using-cookie-authentication-middleware-with-web-api-and-401-response-codes/
Masukkan ini dalam metode ConfigureAuth dalam file Startup.Auth.cs:
sumber
/api
, Anda dapat menggunakan jalur untuk menentukan apakah akan mengarahkan ulang. Ini sangat berguna jika Anda memiliki klien yang menggunakan format lain seperti JSON. Ganti panggilanIsAjaxRequest
denganif (!context.Request.Path.StartsWithSegments(new PathString("/api")))
.private static bool IsAjaxRequest(IOwinRequest request) { return request.Query?["X-Requested-With"] == "XMLHttpRequest" || request.Headers?["X-Requested-With"] == "XMLHttpRequest"; }
Jika Anda menambahkan asp.net WebApi di dalam situs web asp.net MVC, Anda mungkin ingin menanggapi permintaan yang tidak sah. Tapi kemudian infrastruktur ASP.NET ikut bermain dan ketika Anda mencoba untuk mengatur kode status tanggapan ke HttpStatusCode. Tidak Diotorisasi Anda akan mendapatkan 302 redirect ke halaman login.
Jika Anda menggunakan identitas asp.net dan otentikasi berbasis owin di sini kode yang dapat membantu menyelesaikan masalah itu:
sumber
Saya mendapatkan situasi yang sama ketika OWIN selalu mengarahkan respons 401 ke halaman Login dari WebApi. Web API kami mendukung tidak hanya panggilan ajax dari Angular tetapi juga Mobile, Win Form calls. Oleh karena itu, solusi untuk memeriksa apakah permintaan tersebut adalah permintaan ajax tidak benar-benar diurutkan untuk kasus kami.
Saya telah memilih pendekatan lain adalah menyuntikkan respons tajuk baru:
Suppress-Redirect
jika tanggapan berasal dari webApi. Implementasinya ada di handler:Dan daftarkan handler ini di tingkat global WebApi:
Jadi, pada startup OWIN Anda dapat memeriksa apakah header respons memiliki
Suppress-Redirect
:sumber
Dalam versi ASP.NET sebelumnya, Anda harus melakukan banyak hal agar ini berfungsi.
Berita baiknya adalah, karena Anda menggunakan ASP.NET 4.5. Anda bisa menonaktifkan pengalihan otentikasi formulir menggunakan properti HttpResponse.SuppressFormsAuthenticationRedirect baru .
Di
Global.asax
:EDIT : Anda mungkin juga ingin melihat artikel ini oleh Sergey Zwezdin yang memiliki cara yang lebih halus untuk mencapai apa yang Anda coba lakukan.
Cuplikan kode yang relevan dan narasi penulis yang ditempel di bawah. Penulis asli kode dan narasi - Sergey Zwezdin .
Pertama - mari kita tentukan apakah permintaan HTTP saat ini adalah permintaan AJAX. Jika ya, kita harus menonaktifkan penggantian HTTP 401 dengan HTTP 302:
Kedua - mari kita tambahkan kondisi :: jika pengguna diautentikasi, maka kami akan mengirimkan HTTP 403; dan HTTP 401 sebaliknya.
Sudah selesai dilakukan dengan baik. Sekarang kita harus mengganti semua penggunaan standar AuthorizeAttribute dengan filter baru ini. Ini mungkin tidak berlaku untuk orang-orang sime, yang estetika kode. Tapi saya tidak tahu cara lain. Jika sudah, silakan ke komentar.
Yang terakhir, apa yang harus kita lakukan - untuk menambahkan penanganan HTTP 401/403 di sisi klien. Kita dapat menggunakan ajaxError di jQuery untuk menghindari duplikasi kode:
Hasil -
sumber
Jika Anda menjalankan
Web API
dari dalamMVC
proyek Anda, Anda harus membuat kebiasaanAuthorizeAttribute
untuk diterapkan padaAPI
metode Anda . Di dalamIsAuthorized
override
Anda perlu mengambil arusHttpContext
untuk mencegah pengalihan, seperti ini:sumber
Menggunakan integrasi Direktori Aktif Azure sendiri, pendekatan menggunakan
CookieAuthentication
middleware tidak berhasil untuk saya. Saya harus melakukan hal berikut:Jika permintaan berasal dari browser itu sendiri (dan bukan panggilan AJAX, misalnya) maka header Terima akan berisi string
html
di suatu tempat. Hanya ketika klien menerima HTML saya akan mempertimbangkan pengalihan sesuatu yang bermanfaat.Aplikasi klien saya dapat menangani 401 yang memberi tahu pengguna bahwa aplikasi tidak memiliki akses lagi dan perlu memuat ulang untuk masuk lagi.
sumber
Saya juga punya aplikasi MVC5 (System.Web) dengan WebApi (menggunakan OWIN) dan hanya ingin mencegah 401 tanggapan dari WebApi diubah menjadi 302 tanggapan.
Apa yang berhasil bagi saya adalah membuat versi khusus dari WebApi AuthorizeAttribute seperti ini:
Dan untuk menggunakannya sebagai pengganti OtorisasiAttribute WebApi standar. Saya menggunakan standar MVC AuthorizeAttribute untuk menjaga perilaku MVC tidak berubah.
sumber
SuppressFormsAuthenticationRedirect
bendera menyebabkannya hanya mengembalikan 401 yang ada untuk saya.Cukup instal Paket NeGet berikut
Instal-Paket Microsoft.AspNet.WebApi.Owin
Tulis kode berikut dalam file WebApiConfig.
sumber
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
jikaUser.Identity.IsAuthenticated
tidak selalu berfungsifalse
jika Anda ingin menangkap Content-Type == application / json Anda dapat menggunakan kode itu:
salam!!
sumber
Saya mengalami kesulitan mendapatkan kode status dan respons teks yang berfungsi dalam metode OnAuthorization / HandleUnauthorizedRequest. Ini ternyata menjadi solusi terbaik bagi saya:
sumber
Setelah banyak kerepotan mencoba menghindari pengalihan ke halaman login, saya menyadari bahwa ini sebenarnya cukup tepat untuk atribut Otorisasi. Dikatakan pergi dan dapatkan Otorisasi. Sebaliknya untuk panggilan Api yang tidak diotorisasi, saya hanya ingin tidak mengungkapkan informasi apa pun untuk menjadi peretas. Tujuan ini lebih mudah dicapai secara langsung dengan menambahkan atribut baru yang diturunkan dari Otorisasi yang malah menyembunyikan konten sebagai kesalahan 404:
sumber
Mencampur MVC dan WebAPI, jika permintaan tidak sah maka itu akan mengarahkan ulang ke halaman login bahkan dalam permintaan WebAPI juga. Untuk itu, kita dapat menambahkan kode di bawah ini untuk mengirim respons ke aplikasi seluler
sumber
Terima kasih kawan!
Dalam kasus saya, saya menggabungkan jawaban cuongle & Shiva , dan mendapatkan sesuatu seperti ini:
Di pengendali OnException () pengendali untuk Pengecualian API:
Dalam kode konfigurasi startup Aplikasi:
sumber
Dalam MVC 5 dengan Dot Net Framework 4.5.2 kita mendapatkan "application / json, plaint text .." di bawah tajuk "Accept". Akan menyenangkan untuk digunakan seperti berikut:
sumber