Apa yang saya coba lakukan
Saya memiliki API Web Inti ASP.Net backend yang dihosting pada Paket Gratis Azure (Kode Sumber: https://github.com/killerrin/Portfolio-Backend ).
Saya juga memiliki Situs Web Klien yang ingin saya konsumsi menggunakan API itu. Aplikasi Klien tidak akan di-host di Azure, tetapi akan di-host di Halaman Github atau di Layanan Web Hosting lain yang saya punya akses. Karena itu, nama domain tidak akan berbaris.
Melihat ke dalam ini, saya perlu mengaktifkan CORS di sisi API Web, namun saya telah mencoba hampir semuanya selama beberapa jam sekarang dan menolak untuk bekerja.
Bagaimana Saya Mengeset Klien Hanya klien sederhana yang ditulis dalam React.js. Saya menelepon API melalui AJAX di Jquery. Situs Bereaksi berfungsi jadi saya tahu bukan itu. Panggilan Jquery API berfungsi seperti yang saya konfirmasikan dalam Percobaan 1. Berikut adalah cara saya melakukan panggilan
var apiUrl = "http://andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication";
//alert(username + "|" + password + "|" + apiUrl);
$.ajax({
url: apiUrl,
type: "POST",
data: {
username: username,
password: password
},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
var authenticatedUser = JSON.parse(response);
//alert("Data Loaded: " + authenticatedUser);
if (onComplete != null) {
onComplete(authenticatedUser);
}
},
error: function (xhr, status, error) {
//alert(xhr.responseText);
if (onComplete != null) {
onComplete(xhr.responseText);
}
}
});
Apa yang saya coba
Percobaan 1 - Cara yang 'pantas'
https://docs.microsoft.com/en-us/aspnet/core/security/cors
Saya telah mengikuti tutorial ini di Situs Web Microsoft ke T, mencoba semua 3 opsi untuk mengaktifkannya secara global di Startup.cs, Menyiapkannya di setiap pengontrol dan Mencoba di setiap Tindakan.
Mengikuti metode ini, Cross Domain berfungsi, tetapi hanya pada Aksi tunggal pada pengontrol tunggal (POST ke AccountController). Untuk yang lainnya, Microsoft.AspNetCore.Cors
middleware menolak untuk mengatur header.
Saya menginstal Microsoft.AspNetCore.Cors
melalui NUGET dan versinya1.1.2
Ini adalah bagaimana saya mengaturnya di Startup.cs
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add Cors
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// Add framework services.
services.AddMvc();
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy"));
});
...
...
...
}
// This method gets called by the runtime. Use this method to configure
//the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
// Enable Cors
app.UseCors("MyPolicy");
//app.UseMvcWithDefaultRoute();
app.UseMvc();
...
...
...
}
Seperti yang Anda lihat, saya melakukan semua yang diperintahkan. Saya menambahkan Cors sebelum MVC dua kali, dan ketika itu tidak berhasil saya mencoba memakai [EnableCors("MyPolicy")]
setiap pengontrol seperti itu
[Route("api/[controller]")]
[EnableCors("MyPolicy")]
public class AdminController : Controller
Mencoba 2 - Brute Memaksakannya
https://andrewlock.net/adding-default-security-headers-in-asp-net-core/
Setelah beberapa jam mencoba pada upaya sebelumnya, saya pikir saya akan mencoba bruteforce dengan mencoba mengatur header secara manual, memaksa mereka untuk berjalan di setiap respons. Saya melakukan ini mengikuti tutorial ini tentang cara menambahkan header secara manual ke setiap respons.
Ini adalah tajuk yang saya tambahkan
.AddCustomHeader("Access-Control-Allow-Origin", "*")
.AddCustomHeader("Access-Control-Allow-Methods", "*")
.AddCustomHeader("Access-Control-Allow-Headers", "*")
.AddCustomHeader("Access-Control-Max-Age", "86400")
Ini adalah tajuk lain yang saya coba yang gagal
.AddCustomHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "content-type, accept, X-PINGOTHER")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Host, User-Agent, Accept, Accept: application/json, application/json, Accept-Language, Accept-Encoding, Access-Control-Request-Method, Access-Control-Request-Headers, Origin, Connection, Content-Type, Content-Type: application/json, Authorization, Connection, Origin, Referer")
Dengan metode ini, header Cross Site sedang diterapkan dengan benar dan mereka muncul di konsol pengembang saya dan di Postman. Namun masalahnya adalah bahwa sementara melewati Access-Control-Allow-Origin
cek, webbrowser melempar fit (saya percaya) Access-Control-Allow-Headers
menyatakan415 (Unsupported Media Type)
Jadi metode brute force juga tidak berfungsi
Akhirnya
Adakah yang berhasil melakukan ini dan bisa membantu, atau hanya bisa mengarahkan saya ke arah yang benar?
EDIT
Jadi untuk mendapatkan panggilan API, saya harus berhenti menggunakan JQuery dan beralih ke XMLHttpRequest
format Javascript Murni .
Percobaan 1
Saya berhasil mendapatkan Microsoft.AspNetCore.Cors
untuk bekerja dengan mengikuti jawaban MindingData, kecuali dalam Configure
Metode menempatkan app.UseCors
sebelumnya app.UseMvc
.
Selain itu, ketika dicampur dengan Javascript API Solution options.AllowAnyOrigin()
untuk dukungan wildcard mulai berfungsi juga.
Percobaan 2
Jadi saya telah berhasil mendapatkan Percobaan 2 (brute forcing it) untuk bekerja ... dengan satu-satunya pengecualian bahwa Wildcard untuk Access-Control-Allow-Origin
tidak berfungsi dan karena itu saya harus secara manual mengatur domain yang memiliki akses ke sana.
Ini jelas tidak ideal karena saya hanya ingin WebAPI ini dibuka lebar untuk semua orang, tetapi setidaknya ini berfungsi untuk saya di situs terpisah, yang berarti ini adalah permulaan
app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
.AddDefaultSecurePolicy()
.AddCustomHeader("Access-Control-Allow-Origin", "http://localhost:3000")
.AddCustomHeader("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Content-Type, Authorization"));
sumber
415 (Unsupported Media Type)
masalah Anda , aturContent-Type
tajuk permintaan keapplication/json
.Jawaban:
Karena Anda memiliki kebijakan CORS yang sangat sederhana (Izinkan semua permintaan dari domain XXX), Anda tidak perlu membuatnya terlalu rumit. Coba lakukan hal berikut terlebih dahulu (Implementasi CORS yang sangat mendasar).
Jika Anda belum melakukannya, instal paket nuget CORS.
Dalam metode ConfigureServices di startup.cs Anda, tambahkan layanan CORS.
Kemudian dalam metode Konfigurasikan startup.cs Anda, tambahkan berikut ini:
Sekarang cobalah. Kebijakan adalah ketika Anda menginginkan kebijakan yang berbeda untuk tindakan yang berbeda (mis. Host yang berbeda atau header berbeda). Untuk contoh sederhana Anda, Anda benar-benar tidak membutuhkannya. Mulailah dengan contoh sederhana ini dan atur sesuai kebutuhan dari sana.
Bacaan lebih lanjut: http://dotnetcoretutorials.com/2017/01/03/enabling-cors-asp-net-core/
sumber
app.UseCors
SETELAH `` app.UseMvc () `. Middlewares dieksekusi sesuai urutannyaoptions.DisableHttpsRequirement();
agar semua ini berfungsi. Sepertinya pengaturan https cors tidak berlaku.Dalam ConfigureServices tambahkan
services.AddCors();
SEBELUM layanan.AddMvc ();Tambahkan UseCors di Configure
Poin utama adalah add itu
app.UseCors
sebelumnyaapp.UseMvc()
.Pastikan Anda mendeklarasikan fungsionalitas CORS sebelum MVC sehingga middleware menyala sebelum pipa MVC mengontrol dan mengakhiri permintaan.
Setelah metode di atas berfungsi, Anda dapat mengubahnya mengonfigurasi ASAL tertentu untuk menerima panggilan api dan menghindari membiarkan API Anda terbuka bagi siapa pun
Dalam metode configure, beri tahu CORS untuk menggunakan kebijakan yang baru saja Anda buat:
Saya baru saja menemukan artikel ringkas ini tentang subjek - https://dzone.com/articles/cors-in-net-core-net-core-security-part-vi
sumber
Configure()
pesanan tidak terlalu penting di sini dalamConfigureServices()
AllowCredentials()
denganAllowAnyOrigin()
seperti di atas. Untuk menggunakan,AllowCredentials()
Anda perlu mengaturWithOrigins()
. docs.microsoft.com/en-us/aspnet/core/security/…Saya membuat kelas middleware saya sendiri yang bekerja untuk saya, saya pikir ada sesuatu yang salah dengan .net core middleware class
dan menggunakannya dengan cara ini di startup.cs
sumber
if (!context.Request.Headers.ContainsKey(CorsConstants.Origin)) return this._next(context);
Dalam kasus saya,
get
permintaan hanya berfungsi dengan baik sesuai dengan jawaban MindingData. Untuk jenis permintaan lain, Anda perlu menulis:Jangan lupa menambahkan
.AllowAnyHeader()
sumber
Untuk memperluas user8266077 's jawaban , saya menemukan bahwa saya masih perlu respon PILIHAN pasokan untuk permintaan preflight di NET Inti 2.1-preview untuk kasus penggunaan saya:
dan kemudian mengaktifkan middleware seperti di Startup.cs
sumber
app.Use<CorsMiddleware>();
await _next(context)
dan pengaturan kode status dan respons secara manual jika ini terjadi. Saya juga harus menambahkan "otorisasi" ke Access-Control-Allow-Header agar permintaan preflight berfungsi ketika membuat permintaan dari reaksi yang memerlukan otorisasi.sumber
Saya berjuang dengan ini untuk HARI.
Saya akhirnya berhasil bekerja dengan pindah
app.UseCors(CORS_POLICY);
ke TOP ofConfigure()
.Juga:
Microsoft.AspNetCore.Cors
dulu paket NuGet yang diperlukan dalam .Net Core 2 dan yang lebih rendah; sekarang secara otomatis menjadi bagian dari Microsoft.AspNetCore di .Net Core 3 dan lebih tinggi.builder.AllowAnyOrigin()
dan.AllowCredentials()
opsi CORS sekarang saling eksklusif di .Net Core 3 dan yang lebih tinggihttps
. URL http tampaknya memberikan kesalahan CORS terlepas dari konfigurasi CORS server Net. Misalnya,http://localhost:52774/api/Contacts
akan memberikan kesalahan CORS; cukup mengubah URL menjadihttps://localhost:44333/api/Contacts
berfungsi.Catatan tambahan :
sumber
Tak satu pun dari prosedur di atas yang membantu dan saya kemudian membaca artikel yang menyelesaikan masalah.
Di bawah ini adalah kode.
dan
dan di atas metode tindakan saya
sumber
app.UseCors()
) dengan[EnableCors()]
dalam aplikasi yang sama. Anda harus menggunakan satu atau yang lain - tetapi tidak keduanya: docs.microsoft.com/en-us/aspnet/core/security/… :Use the [EnableCors] attribute or middleware, not both in the same app.
coba tambahkan
jQuery.support.cors = true;
sebelum panggilan AjaxBisa juga bahwa data yang Anda kirim ke API tidak jelas,
coba tambahkan fungsi JSON berikut
lalu di data Anda: objek ubah ke
sumber
Solusi paling sederhana adalah tambahkan
ke Startup.cs.
sumber
Saya pikir jika Anda menggunakan Anda sendiri CORS middleware Anda perlu memastikan itu benar-benar Cors permintaan dengan memeriksa asal sundulan.
sumber
Access-Control-Allow-Origin
header tidak dikeluarkan oleh server. Sebenarnya saya mengirim permintaan melalui tukang pos tanpaOrigin
header. Ini menyelamatkan hari saya! (Atau setidaknya pagi hari;))Berdasarkan komentar Anda dalam jawaban MindingData, itu tidak ada hubungannya dengan CORS Anda, itu berfungsi dengan baik.
Tindakan Pengontrol Anda mengembalikan data yang salah. HttpCode 415 berarti, "Jenis media yang tidak didukung". Ini terjadi ketika Anda memberikan format yang salah ke controller (yaitu XML ke controller yang hanya menerima json) atau ketika Anda mengembalikan tipe yang salah (mengembalikan Xml dalam controller yang dinyatakan hanya mengembalikan xml).
Untuk nanti periksa keberadaan
[Produces("...")]
atribut pada tindakan Andasumber
Bagi saya, itu tidak ada hubungannya dengan kode yang saya gunakan. Untuk Azure kami harus masuk ke pengaturan Layanan Aplikasi, pada menu samping entri "CORS". Di sana saya harus menambahkan domain tempat saya meminta barang. Begitu saya memilikinya, semuanya ajaib.
sumber
Di launchSettings.json, di bawah iisSettings, atur anonymousAuthentication menjadi true:
Kemudian, di Startup.cs, di bawah ConfigureServices, sebelum services.AddMvc, tambahkan:
dan kemudian, dalam metode configure, sebelum app.UseMvc () tambahkan:
sumber
Saya menggunakan .Net CORE 3.1 dan saya menghabiskan waktu lama untuk membenturkan kepala ke dinding dengan yang ini ketika saya menyadari bahwa kode saya sudah mulai bekerja tetapi lingkungan debug saya rusak, jadi inilah 2 petunjuk jika Anda mencoba memecahkan masalah masalah:
Jika Anda mencoba mencatat tajuk respons menggunakan middleware ASP.NET, tajuk "Access-Control-Allow-Origin" tidak akan pernah muncul meskipun ada di sana. Saya tidak tahu bagaimana, tetapi tampaknya ditambahkan di luar pipa (pada akhirnya saya harus menggunakan wireshark untuk melihatnya).
.NET CORE tidak akan mengirim "Akses-Kontrol-Izinkan-Asal" dalam respons kecuali Anda memiliki header "Asal" dalam permintaan Anda. Tukang pos tidak akan menyetel ini secara otomatis sehingga Anda harus menambahkannya sendiri.
sumber
Dalam kasus saya, saya memperbaiki dengan UseCors sebelum UserRouting ..
sumber
.NET Core 3.1
Bekerja untuk saya dan bagaimana dokumen mengatakan untuk melakukannya:
di kelas Startup:
Dalam metode ConfigureServices ():
Dalam metode Konfigurasikan ():
https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1
sumber
Saya mendapat jawaban MindingData di atas untuk bekerja, tetapi saya harus menggunakan Microsoft.AspNet.Cors, bukan Microsoft.AspNetCore.Cors. Saya menggunakan proyek .NetCore Aplikasi Web API di Visual Studio 2019
sumber
Itu
akan memungkinkan Anda untuk melakukan CORS dengan fitur bawaan, tetapi tidak menangani permintaan PILIHAN. Solusi terbaik sejauh ini adalah menciptakan Middleware baru seperti yang disarankan dalam posting sebelumnya. Periksa jawaban yang ditandai benar di pos berikut:
Aktifkan tajuk OPSI untuk CORS di .NET Core Web API
sumber
Cara sederhana dan mudah untuk melakukannya.
Install-Package Microsoft.AspNetCore.Cors
app.UseCors(options => options.AllowAnyOrigin());
sumber
Ini kode saya:)
sumber
Inilah cara saya melakukan ini.
Saya melihat bahwa dalam beberapa jawaban mereka mengatur
app.UserCors("xxxPloicy")
dan memasukkan[EnableCors("xxxPloicy")]
pengontrol. Anda tidak perlu melakukan keduanya.Inilah langkah-langkahnya.
Di Startup.cs di dalam ConfigureServices tambahkan kode berikut.
Jika Anda ingin menerapkan seluruh proyek maka tambahkan kode berikut dalam metode Konfigurasi di Startup.cs
Atau
Jika Anda ingin menambahkannya ke pengontrol spesifik maka tambahkan aktifkan kode kor seperti yang ditunjukkan di bawah ini.
Untuk info lebih lanjut: lihat ini
sumber
Gunakan atribut Action / Controller kustom untuk mengatur header CORS.
Contoh:
Kemudian di Web API Controller / Action:
sumber
Hanya untuk menambahkan untuk menjawab di sini, jika Anda menggunakan
app.UseHttpsRedirection()
, dan Anda tidak memukul port SSL mempertimbangkan berkomentar ini.sumber
Saya menggunakan blassor webassembly sebagai client dan asp.net web api core sebagai backend dan memiliki masalah kors juga.
Saya menemukan solusi dengan kode ini:
Inti web api ASP.Net saya Startup.cs ConfigureServices dan Metode konfigurasi baris pertama terlihat seperti ini:
dan metode Konfigurasi saya:
ubah
http://example.com
dengan domain klien atau alamat ip Andasumber
sumber