2015-09-11 10 views
11

Tôi đang cố gắng tìm ra những gì tôi đang thiếu trong cách tiếp cận của mình ngăn cản dịch vụ WCF của tôi không bị truy cập. Nếu tôi cố gắng truy cập dịch vụ thông qua yêu cầu AJAX từ cùng một miền, thì không có vấn đề gì.jQuery AJAX CORS với dịch vụ ASP.NET WCF không hoạt động mặc dù các mục nhập web.config

Tôi đã thực hiện lời khuyên mà tôi đã thấy ở nơi khác trên trang web để thêm vào thẻ <httpProtocol> trong web.config để bật CORS, nhưng dường như không hoạt động (lưu ý một vài yếu tố đầu tiên trong customHeaders đang có vì lý do bảo mật khác nhau):

<location path="FooBar.svc"> 
    <system.webServer> 
     <httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Request-Method" value="POST"/> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Headers" value="Content-Type, X-Requested-With, X-Custom-Header" /> 
     </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
    </location> 

Mặc dù việc này là tại chỗ, tôi vẫn nhận được một lỗi (sử dụng IE Developer Tools) khi cố gắng gọi cho dịch vụ từ một trang riêng biệt: "XMLHttpRequest cho .. Yêu cầu Chia sẻ tài nguyên gốc chéo (CORS) "

Cuộc gọi jQuery ajax của tôi (Bài đăng) có các giá trị được đặt để sử dụng với CORS, cũng như:

crossDomain: true, 
xhrFields: { withCredentials: true }, 

Tôi thậm chí đã cố gắng thêm một sửa chữa cho các vấn đề IE XDR tiềm năng, từ https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js, không có hiệu lực thi hành (Tôi đang sử dụng IE11, vì vậy tôi sẽ không mong đợi nó)

Bất cứ ai có bất cứ ý tưởng như những gì có thể xảy ra ở đây?

(EDIT: bản thân dịch vụ được thiết lập với các thuộc tính, nếu nó làm cho một sự khác biệt:

[OperationContract] 
[WebInvoke(Method = "POST", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     ResponseFormat = WebMessageFormat.Json)] 

)

(EDIT 2: Trong trường hợp đó là có ý nghĩa, dịch vụ đó có phải là một phần của trang web tất cả HTTPS sử dụng Xác thực biểu mẫu - và dịch vụ cần sử dụng thông tin đăng nhập tương tự như trang web. )

+2

Bạn đã thử gọi dịch vụ bằng cách sử dụng một cái gì đó như người đưa thư? Bạn có thể thấy Access-Control-Allow-Origin trong tiêu đề phản hồi http không? –

+0

Thật không may, tôi không thể cài đặt bất cứ thứ gì trên máy làm việc của mình, vì vậy tôi phải chờ quá trình yêu cầu nó đi qua trước khi tôi có được bất kỳ công cụ hữu ích nào (và dịch vụ không có sẵn trên bên ngoài). Tôi đã hy vọng để có được một bước nhảy vọt về điều này. – notnot

+0

máy chủ phụ trợ plz? – Akki619

Trả lời

4

Bạn đã thử với $ .support.cors = true trong jquery.

+0

Xin lỗi, điều đó không thay đổi bất cứ điều gì, ít nhất là trên riêng của nó. – notnot

5

Phần <customHeaders> web.config của bạn được thiết lập cho các yêu cầu CORS không có bằng chứng xác thực. Bạn cần một cấu hình khác nhau cho phép yêu cầu CORS với các thông tin:

  1. Đặt thêm Access-Control-Allow-Credentials tiêu đề để true.

  2. Access-Control-Allow-Origin tiêu đề không thể được đặt thành *. Bạn phải trả về một trường hợp nhạy cảm với trường hợp cho nguồn gốc/máy chủ yêu cầu CORS.

Nguồn: 7.2 Resource Sharing Check (W3C Recommendation for Cross-Origin Resource Sharing)

+0

Vẫn không thay đổi hành vi – notnot

7

Kích hoạt CORS true trong máy chủ backend nơi dịch vụ được lưu trữ lý tưởng nên giải quyết vấn đề. Tuy nhiên có một cách khác ... Bạn có thể có một trình bao bọc giữa mã jQuery và dịch vụ WCF (Lưu ý: Đó là một trong những cách tiếp cận bạn phải đề xuất trong nhóm khi bạn không có quyền truy cập để sửa đổi ví dụ htaccess tập tin trong apache, nơi chúng tôi thiết lập các CORS để có quyền truy cập vào tên miền khác truy cập vào dịch vụ của chúng tôi). Cách tiếp cận như thế này ....

jQuery Code -> Wrapper (Webmethod in .NET) -> WCF service

jQuery mã và Wrapper nằm trong cùng một miền. jQuery cuộc gọi webmethod mà lần lượt bắn một cuộc gọi đến phương pháp dịch vụ WCF tương ứng để có được dữ liệu. Sự sụp đổ của phương pháp này là yêu cầu đi qua một lớp nữa, lý do tại sao tôi đã đề cập đến Ghi chú ngay từ đầu.

+0

Có gì khác ngoài mục nhập trong web.config để bật CORS không? Tôi có phải thay đổi một cái gì đó trong IIS chính nó? – notnot

+0

kiểm tra SSL như đã nói bởi ViajyP. Chỉ cần nitpicking tôi đã gặp phải loại tương tự cho vấn đề khác nhau cho các tập tin woff, tôi sẽ đề nghị bài thay đổi ssl khởi động lại toàn bộ IIS. – Akki619

5

Nếu dịch vụ của bạn đang sử dụng HTTPS và nếu bạn đang sử dụng chứng chỉ SSL tự ký thì các cuộc gọi qua miền sẽ Fail bất chấp thiết lập web.config được thực hiện cho tiêu đề Access-Control-Allow-Origin. Bạn nên thử nhập Giấy chứng nhận SSL hợp lệ vào IIS của bạn và xem những gì bạn nhận được.

+0

Tại sao trường hợp này lại xảy ra? – notnot

+2

đây là cách trình duyệt hoạt động.Điều này là để tránh lỗ hổng trên trang web (XXS). Để khắc phục điều này cho mục đích thử nghiệm; bạn có thể thử các bước sau: 1) Mở trang tên miền chéo của bạn có yêu cầu Ajax trong tab đầu tiên của trình duyệt của bạn. 2) Mở bất kỳ trang HTTPS nào trên trang web của bạn có chứa máy chủ WCF trong tab 2. 3) Vì bạn đã tự ký SSL; bạn sẽ nhận được cảnh báo Chứng nhận và thông báo "Tôi hiểu rủi ro ... tiếp tục" với liên kết. 4) nhấp vào liên kết tiếp tục 5) bây giờ lại đến tab 1 có trang tên miền khác 6) làm mới nó và Ajax của bạn để WCF sẽ hoạt động. Trên Prod, bạn sẽ có SSL hợp lệ. – vijayP

-1

đã thử thêm Access-Control-Allow-Origin trong tiêu đề trong Response như sau (chỉ khi bạn muốn dịch vụ WCF của bạn có thể truy cập từ bất kỳ tên miền),

Trong một trong những phương thức web API của tôi, tôi đã sử dụng UrlReferrer cho việc này. Mã này trông giống như sau

Uri referredURL = HttpContext.Current.Request.UrlReferrer; 
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://" + referredURL.Host); 

Nhưng phương pháp này là ít nguy hiểm, vì nó không được đảm bảo dù bạn sẽ nhận được UrlReferrer hay không bởi vì nó phụ thuộc vào khách hàng (trình duyệt).

4

Với WCF, bạn cần phải làm nhiều hơn là chỉ thêm tiêu đề tùy chỉnh trong web.config. Chỉ cần chỉnh sửa web.config là đủ cho ASP.NET Web API, nhưng nếu đó không phải là những gì bạn đang làm việc trên, bạn sẽ cần phải thêm mã tùy chỉnh để cho phép tiêu đề OPTIONS, trong dịch vụ web của bạn. Về cơ bản, bạn cần phải tạo một thanh tra thư và sau đó một số hành vi điểm cuối sử dụng lớp kiểm tra thư để thêm tiêu đề bắt buộc.

Đối với mã và dịch vụ ví dụ, hãy xem the WCF page on enable-cors.org.

+0

Sẽ không có cơ hội để kiểm tra điều này ngay bây giờ trước khi tiền thưởng hết, nhưng điều này có vẻ như nó đang đi đúng hướng. – notnot

+1

Bạn cũng có thể muốn xem [bài đăng trên blog này] (http://blogs.microsoft.co.il/idof/2011/07/02/cross-origin-resource-sharing-cors-and-wcf/) từ Năm 2011, vì nó chứa một nhà máy dịch vụ lưu trữ có thể giúp bạn tiết kiệm thời gian thực hiện. Đó là một cơn đau đầu thực sự so với việc kích hoạt CORS với các backend khác, nhưng nó có thể là 100%. –

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