Tôi đang cố gắng bật CORS nhưng tôi liên tục có cùng một vấn đề với mỗi yêu cầu được gửi từ ứng dụng web AngularJS của tôi:Không có Access-Control-Allow-Origin với Firefox, nhưng hoạt động với Chrome và Safari
Cross- Yêu cầu xuất xứ bị chặn: Chính sách gốc tương tự không cho phép đọc tài nguyên từ xa tại https://.../ ... (Lý do: CORS tiêu đề 'Access-Control-Allow-Origin' bị thiếu).
Và nó chỉ xảy ra với Firefox! Nó hoạt động hoàn hảo với Chrome, Safari, IE và Edge.
Môi trường:
API của tôi là một Api NET Web 2.3 (.NET 4.6) được lưu trữ trên Azure Services App (IIS 8.0).
Ứng dụng trước của tôi là ứng dụng web AngularJS mà tôi truy cập qua https và tiêu thụ API qua https.
Tôi đã làm gì: Tôi có một lớp Khởi động được khai báo là điểm khởi đầu cho Owin.
[assembly: OwinStartup(typeof(Startup))]
namespace SentinelleApi
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.Map("/signalr", map =>
{
map.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
EnableDetailedErrors = true,
EnableJavaScriptProxies = false
};
map.RunSignalR(hubConfiguration);
});
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
}
}
}
Tôi có một lớp WebApiConfig đó được khai báo như sau:
namespace SentinelleApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// No need to declare config.EnableCors() here, the app.UseCors(...) does the job in startup section
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new {id = RouteParameter.Optional}
);
}
}
}
Tôi không chạm vào web.config để tự thêm header (Tôi đã thử, nhưng nó đã không giải quyết vấn đề của tôi). Dù sao, nó không được khuyến khích để thêm các tiêu đề trong web.config và để có app.UseCors() cùng một lúc.
Vì vậy, trên Firefox, tôi gặp lỗi CORS, nhưng trên Safari/Chrome, không sao cả!
Tôi có Access-Control-Allow-Origins ở mọi nơi ngoại trừ Firefox.
Mở Chrome:
Trên Firefox:
EDIT: Vâng, tôi đã điều tra hơn một chút, và nếu tôi chuyển sang địa chỉ webapp của tôi từ https: // đến http: //, mọi thứ hoạt động tốt trên Firefox (ngoài ra, API của tôi có thể được Angular sử dụng qua https mà không gặp vấn đề gì về CORS) ...
Tôi thực sự không hiểu điều gì đang diễn ra, nhưng kỳ diệu, Access-Control-Allow-Origin xuất hiện trên mọi tuyến API được Firefox tiêu thụ, không phải là trường hợp đó là kết nối an toàn (https) . Tôi dựa vào https Azure chứng chỉ từ Microsoft, mà dường như là hợp lệ (biểu tượng khóa là màu xanh lá cây).
Tất nhiên, tôi muốn giữ https, nhưng tôi không biết cách giải quyết vấn đề của mình.
vẻ có liên quan đến: Firefox CORS request giving 'Cross-Origin Request Blocked' despite headers
Tôi đã thực hiện một quy tắc viết lại liên quan đến khách hàng ứng dụng web (nơi tổ chức AngularJS). Trong trang web của tôi.cấu hình, tôi có:
<rule name="RedirectToHTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
<add input="{URL}" pattern="/$" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="https://{SERVER_NAME}/{R:1}" redirectType="SeeOther" />
</rule>
Khi tôi loại bỏ nó, nó là tốt (ứng dụng web của tôi có thể truy cập sử dụng HTTP), nhưng khi tôi chuyển sang HTTPS, và mặc dù server API chấp nhận tất cả nguồn gốc, nó không thành công.
Vì vậy, câu hỏi: Tôi có nên thêm điều gì đó đặc biệt để làm cho HTTPS/chứng chỉ hoạt động với CORS (trong Firefox) không?
Cũng liên quan: https://stackoverflow.com/questions/33743645/iis-reverse-proxy-to-bypass-cors-issue
Ứng dụng góc của bạn có đang chạy trong cùng một miền đó mọi lúc không? Nếu vậy bạn có thể thêm tên miền đó vào . –
jsxsl
Thực tế ứng dụng Angular của tôi luôn nằm trên cùng một miền, nhưng việc thêm URL của nó thay vì * không thay đổi – Ben
Bạn đã thử xóa dòng: var cors = new EnableCorsAttribute ("*", "*", "*") ; – jsxsl