2013-05-14 34 views
6

Tôi muốn truy cập listdata.svc (dịch vụ chia sẻ) nằm trên domainA.contoso.com từ một ứng dụng web nằm trên domainB.contoso.com - Xác thực có vẻ là một vấn đề.401 khi cố gắng triển khai CORS cho SharePoint

Khi cố gắng truy cập ListData.svc qua cuộc gọi JQuery Ajax, với CORS được bật, máy chủ trả về 401. Nếu tôi chạy cùng một Truy vấn từ trang .htm mà tôi thực thi từ bên trong SharePoint, cuộc gọi hoạt động tốt, vì tên miền giống nhau.

SharePoint đang sử dụng NTLM với xác thực ẩn danh bị tắt - Tôi cho rằng 401 là kết quả của thông tin đăng nhập cửa sổ không được chuyển đến máy chủ SharePoint - nhưng tôi không biết cách thêm thông tin xác thực này vào tiêu đề. Tôi đã đặt xhrFields: {withCredentials: true}, nhưng điều này dường như không khắc phục được sự cố xác thực.

Để kích hoạt CORS, tôi đã thiết lập sau đây phản hồi HTTP Headers trên SharePoint trong IIS:

  • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Headers: xuất xứ, Content-Type, Chấp nhận
  • Access-Control-Allow-Origin: *
  • Access-Control-Yêu cầu-Phương pháp: POST, GET, HEAD, OPTIONS

Xác thực Windows được bật trong IIS cho ứng dụng web của tôi và tôi không đặt trình xử lý HTTP "OPTIONSVerbHandler" trong IIS. Biến nó thành đọc dường như không tạo nên sự khác biệt.

gọi

JQuery Ajax (từ ứng dụng trên subdomainB.contoso.com):

$.ajax({ 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     url: listUrl, 
     xhrFields: { withCredentials: true }, 
     crossDomain:true, 
     processData: false, 
     async: true, 
     dataType: "json", 
     converters: { 
      // WCF Data Service .NET 3.5 incorrectly escapes singles quotes, which is clearly 
      // not required (and incorrect) in JSON specs. 
      // http://bugs.jquery.com/ticket/8320?cversion=0&cnum_hist=1 
      "text json": function (textValue) { 
       return jQuery.parseJSON(textValue.replace(/(^|[^\\])\\'/g, "$1'")); 
      } 
     }, 
     success: function (data, status, xhr) { 
      //successFunc(data.d.results); 
      alert("working!"); 
     }, 
     error: function (xhr, status, error) { 
      alert("failure!"); 
     } 
    }); 

HTTP Header và 401 đáp ứng:

Key Value 
Request OPTIONS /_vti_bin/ListData.svc/Contacts HTTP/1.1 
Accept */* 
Origin http://domainB.contoso.com 
Access-Control-Request-Method GET 
Access-Control-Request-Headers content-type, accept 
Accept-Encoding gzip, deflate 
User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0) 
Host domainA.contoso.com 
Content-Length 0 
DNT 1 
Connection Keep-Alive 
Cache-Control no-cache 

Key Value 
Response HTTP/1.1 401 Unauthorized 
Server Microsoft-IIS/7.5 
SPRequestGuid 1e33061c-f555-451b-9d69-0d83eff5f5ea 
WWW-Authenticate NTLM 
X-Powered-By ASP.NET 
MicrosoftSharePointTeamServices 14.0.0.4762 
Access-Control-Allow-Headers Origin, Content-Type, Accept 
Access-Control-Allow-Origin * 
Access-Control-Request-Methods POST, GET, HEAD, OPTIONS 
Access-Control-Allow-Credentials true 
Date Wed, 15 May 2013 15:04:51 GMT 
Content-Length 0 
+0

bạn đã cố gắng gửi bài này trên http://sharepoint.stackexchange.com/ –

Trả lời

3

Cuối phản ứng, nhưng tôi tìm thấy một chủ đề khác here có một giải pháp dễ dàng cho IIS và nó đã làm việc cho tôi. Về cơ bản tiêu chuẩn CORS xác định rằng yêu cầu preflight không nên gửi bất kỳ thông tin xác thực nào, do đó 401. Trong chủ đề đó có một ví dụ về việc hạn chế các yêu cầu ẩn danh đến động từ OPTIONS cho phép trả lời 200 cho động từ preflight (TÙY CHỌN)) yêu cầu nhưng vẫn yêu cầu xác thực cho những người khác.

0

Tôi không chắc chắn những gì bạn có ý nghĩa bởi "xác thực ẩn danh bị vô hiệu hóa", nhưng có vẻ như đó chính xác là lý do bạn nhận được phản hồi 401 (Unauthorized) onse. Nó không liên quan đến CORS, nhưng máy chủ cho khách hàng biết nó yêu cầu tên người dùng và mật khẩu trước khi nó cho phép truy cập.

Hãy thử qua một tên người dùng và mật khẩu để $.ajax() (CẢNH BÁO: nó chỉ là để kiểm tra xem có thể giải quyết vấn đề của bạn, hardcoding chi tiết như trong mã JS của bạn là một ý tưởng tồi):

$.ajax({ 
    crossDomain:true,  
    url: listUrl, 
    username: VALID_USERNAME, 
    password: VALID_PASSWORD, 
    success: function(data){alert("hello json!") }, 
    error: function() { 
    alert("epic fail"); 
    }, 
    dataType:'json' 
}); 
+0

auth vô danh là một trong những chế độ tắt trong IIS. Thông thường sharepoint sử dụng Windows Auth. – Ray

+0

@ Cảm ơn bạn đã làm rõ :) Tôi không biết liệu điều đó có ảnh hưởng đến việc chuyển các thuộc tính 'username' /' password' sang '$ .ajax()' hay không. – robertklep

+0

Tôi đã cập nhật câu hỏi - sử dụng tên người dùng/mật khẩu hoặc vớiCredentials, dường như không hoạt động. – Ray