Những gì tôi đang cố gắng làm
Tôi có API Web lõi ASP.Net được lưu trữ trên Gói miễn phí Azure (Mã nguồn: https://github.com/killerrin/Port portfolio -Backend ).
Tôi cũng có một trang web khách hàng mà tôi muốn sử dụng API đó. Ứng dụng khách sẽ không được lưu trữ trên Azure mà thay vào đó sẽ được lưu trữ trên trang Github hoặc trên một dịch vụ lưu trữ web khác mà tôi có quyền truy cập. Bởi vì điều này, tên miền sẽ không xếp hàng.
Nhìn vào điều này, tôi cần kích hoạt CORS ở phía API Web, tuy nhiên tôi đã thử mọi thứ trong vài giờ và nó đang từ chối hoạt động.
Cách tôi cài đặt Máy khách Nó chỉ là một ứng dụng khách đơn giản được viết bằng React.js. Tôi đang gọi API thông qua AJAX trong Jquery. Trang web React hoạt động để tôi biết không phải vậy. Cuộc gọi API Jquery hoạt động như tôi đã xác nhận trong Nỗ lực 1. Đây là cách tôi thực hiện các cuộc gọi
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);
}
}
});
Những gì tôi đã cố gắng
Cố gắng 1 - Cách 'phù hợp'
https://docs.microsoft.com/en-us/aspnet/core/security/cors
Tôi đã theo hướng dẫn này trên Trang web của Microsoft đến T, thử cả 3 tùy chọn kích hoạt nó trên toàn cầu trong Startup.cs, Thiết lập nó trên mọi bộ điều khiển và Thử trên mọi hành động.
Theo phương pháp này, Tên miền chéo hoạt động, nhưng chỉ trên một Hành động duy nhất trên một bộ điều khiển duy nhất (POST lên AccountContoder). Đối với mọi thứ khác, Microsoft.AspNetCore.Cors
phần mềm trung gian từ chối đặt các tiêu đề.
tôi đã cài đặt Microsoft.AspNetCore.Cors
qua NUGET và phiên bản là1.1.2
Đây là cách tôi thiết lập nó trong 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();
...
...
...
}
Như bạn thấy, tôi đang làm mọi thứ như đã nói. Tôi đã thêm Cors trước MVC cả hai lần và khi nó không hoạt động, tôi đã cố gắng đặt [EnableCors("MyPolicy")]
mọi bộ điều khiển như vậy
[Route("api/[controller]")]
[EnableCors("MyPolicy")]
public class AdminController : Controller
Cố gắng 2 - Brute Buộc nó
https://andrewlock.net/adding-default-security-headers-in-asp-net-core/
Sau vài giờ thử với lần thử trước, tôi đoán rằng tôi sẽ cố gắng đánh bại nó bằng cách cố gắng đặt các tiêu đề theo cách thủ công, buộc chúng phải chạy trên mọi phản hồi. Tôi đã làm theo hướng dẫn này về cách thêm thủ công vào mỗi phản hồi.
Đây là những tiêu đề tôi đã thêm
.AddCustomHeader("Access-Control-Allow-Origin", "*")
.AddCustomHeader("Access-Control-Allow-Methods", "*")
.AddCustomHeader("Access-Control-Allow-Headers", "*")
.AddCustomHeader("Access-Control-Max-Age", "86400")
Đây là những tiêu đề khác tôi đã thử mà thất bại
.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")
Với phương pháp này, các tiêu đề Trang web chéo đang được áp dụng đúng cách và chúng hiển thị trong bảng điều khiển dành cho nhà phát triển của tôi và trong Postman. Tuy nhiên, vấn đề là trong khi nó vượt qua Access-Control-Allow-Origin
kiểm tra, webbrowser ném một sự phù hợp rít lên (tôi tin)Access-Control-Allow-Headers
nói rõ415 (Unsupported Media Type)
Vì vậy, phương pháp vũ phu cũng không hoạt động
Cuối cùng
Có ai đã nhận được điều này để làm việc và có thể giúp một tay, hoặc chỉ có thể chỉ cho tôi đi đúng hướng?
BIÊN TẬP
Vì vậy, để thực hiện các lệnh gọi API, tôi đã phải ngừng sử dụng JQuery và chuyển sang XMLHttpRequest
định dạng Pure Javascript .
Cố gắng 1
Tôi đã xoay sở để có được Microsoft.AspNetCore.Cors
công việc bằng cách làm theo câu trả lời của MindingData, ngoại trừ trong Configure
Phương thức đặt app.UseCors
trước app.UseMvc
.
Ngoài ra, khi được trộn với Giải pháp API Javascript options.AllowAnyOrigin()
để hỗ trợ ký tự đại diện cũng bắt đầu hoạt động.
Cố gắng 2
Vì vậy, tôi đã quản lý để cho Nỗ lực 2 (buộc phải dùng nó) hoạt động ... với ngoại lệ duy nhất là Wildcard Access-Control-Allow-Origin
không hoạt động và do đó tôi phải tự đặt các tên miền có quyền truy cập vào nó.
Nó rõ ràng không lý tưởng vì tôi chỉ muốn WebAPI này được mở rộng cho mọi người, nhưng nó ít nhất hoạt động với tôi trên một trang web riêng biệt, điều đó có nghĩa là nó là một sự khởi đầu
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"));
415 (Unsupported Media Type)
vấn đề của bạn , đặtContent-Type
tiêu đề yêu cầu thànhapplication/json
.