2016-02-02 26 views
6

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:

chrome

Trên Firefox:

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

+0

Ứ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

+0

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

+0

Bạn đã thử xóa dòng: var cors = new EnableCorsAttribute ("*", "*", "*") ; – jsxsl

Trả lời

3

Tôi đang đối mặt với cùng một vấn đề và lỗi dường như được khắc phục trên phiên bản mới của Firefox - 45.0.0. Hãy thử cập nhật và kiểm tra lại. Tôi sẽ giải thích vấn đề cho người dùng và hướng dẫn họ thực hiện nâng cấp.

+0

Cảm ơn anh chàng! Đó là công việc, hoàn hảo;) – Ben

5

Bạn nghĩ bạn có thể có vấn đề này Firefox CORS request giving 'Cross-Origin Request Blocked' despite headers

Firefox sử dụng một kho chứng chỉ khác nhau từ chrome/IO bạn có thể kiểm tra giấy chứng nhận dưới công cụ -> Tùy chọn -> tiên tiến và sau đó bạn có một nút để xem cửa hàng ceritifcate.

+0

Nó có thể liên quan có, nhưng tôi không nghĩ rằng chứng chỉ không hợp lệ hoặc không đúng định dạng, vì tôi sử dụng miền * azurewebsites.net được liên kết với chứng chỉ https hợp lệ được ký từ Microsoft. – Ben

+0

Nhưng nếu bạn kiểm tra liên kết bạn đang cố truy cập qua https trong firefox. firefox có phàn nàn không? – Batavia

+0

Không, tôi không có bất kỳ cảnh báo nào từ Firefox, nó thừa nhận chứng chỉ là Chrome hoặc Safari làm – Ben

1

Tôi gặp phải sự cố này với tập lệnh PHP sẽ kiểm tra tiêu đề yêu cầu 'Origin' và thêm tiêu đề phản hồi 'Access-Control-Allow-Origin' nếu nó khớp với những gì được mong đợi.

Cuối cùng vấn đề là firefox được gửi header như 'nguồn gốc' (tất cả chữ thường), trong khi kịch bản của tôi đang tìm kiếm tiêu đề chuẩn 'xứ' (trường hợp hỗn hợp).

Khắc phục là thêm trình xử lý cho tiêu đề yêu cầu tất cả chữ thường 'gốc'.

+0

Bạn có thể thêm một số chi tiết về cách bạn thêm một trình xử lý cho các tiêu đề yêu cầu 'gốc' chữ thường không?Tôi đã poked xung quanh một chút trong IIS và tôi biết nơi để thêm xử lý, nhưng tôi không biết cú pháp vượt ra ngoài đó. Tôi tò mò cho IIS 7. – ejo4041

+0

Tôi chỉ cần sao chép khối mã trường hợp hỗn hợp và thay đổi chuỗi thành tất cả chữ thường. Điều tương tự có thể đạt được với một 'hoặc' trong cấu trúc điều khiển. –

Các vấn đề liên quan