2013-02-04 22 views
17

Tôi có một WC.NET aspF trên .NET 4. Dịch vụ này được sử dụng để xác thực người dùng. Chúng tôi đang gửi một tên người dùng và mật khẩu và sau đó một Tiêu đề HTTP nên được trả lại với cookie xác thực được bao gồm. Sử dụng trang thử nghiệm được lưu trữ cục bộ, trang này hoạt động chính xác. Bây giờ tôi đang truy cập để truy cập vào tên miền chéo thông tin tiêu đề. Tôi đã cài đặt trang thử nghiệm của mình trên một máy khác và được định cấu hình để gọi qua WCF. Cuộc gọi đang hoạt động và trả lời 'dữ liệu' trong cuộc gọi là chính xác. Tuy nhiên, tôi không thể truy cập các thông tin tiêu đề với một trong hai điều sau đây:xmlHttp.getResponseHeader + Không hoạt động cho CORS

alert(xmlHttp.getAllResponseHeaders()); 

hoặc

alert(xmlHttp.getResponseHeader("Set-Cookie")); 

Sử dụng trình gỡ lỗi trong IE và 'Tiêu đề HTTP Live' cắm cho Firefox, tôi có thể xem thông tin tiêu đề đang được trả về.

Trong trang ajax toàn cầu của tôi, tôi đang thiết lập phản hồi để xử lý CORS.

private void EnableCrossDomainAjaxCall() 
{ 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 


    if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
    { 

     HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 

     HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
     HttpContext.Current.Response.End(); 
    } 

} 

Đây là AJAX Tôi đang sử dụng để gọi các dịch vụ:

$("#btnLogin").click(function (e) { 
      var geturl; 
      geturl = $.ajax({ 
       // type: "POST", 
       type: "GET", 
       contentType: "application/json; charset=utf-8", 
       url: 'http://10.0.4.66/AuthenticationService.svc/Login?Name=test&password=pwsd', 
       // url: '../SecurityServer/AuthenticationService.svc/Login?Name=test&password=pwsd', 
       dataType: "jsonp", 
       error: function (request, status, error) { 
        alert('Error Occured'); 
       }, 
       crossdomain: true, 
       success: function (data, textStatus, xmlHttp) { 
        // alert(xmlHttp.getResponseHeader("Content-Type")); 
        document.write(xmlHttp.getResponseHeader("Content-Type") + "<br/>"); 
        alert(xmlHttp.getAllResponseHeaders()); 
        alert(xmlHttp.getResponseHeader("Set-Cookie")); 
        var headers = ''; 
        var headerPair = xmlHttp.getAllResponseHeaders('wcfCookie').split("\r\n"); 
        var output = ''; 
        $.each(headerPair, function (key, line) { 
         var parts = line.split(':'); 

         if (parts[0] == 'wcfCookie') { 
          ChocChip = parts[1] 
          return false 
         } 

        }); 

       } 

      }); 

Dưới đây là thông tin tiêu đề của tôi túm lấy từ

Date: Mon, 04 Feb 2013 12:12:40 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 4.0.30319 
Access-Control-Allow-Origin: * 
Set-Cookie: wcfCookie=8D38D5D6A0F138FEB595DD016F7694EDDF3E6757C82ED3D419F5047A5294974C1885487465CEC0A0BCC2B3802C7B03FF9F5370A05D4CCBDDDABCB1558C3816044BF4F78209BF38C6B1A7CAD34CD3C85C40B8515CFB1C2B2694BC78803D8DACB4 
Content-Length: 65 
Cache-Control: application/json; charset=utf-8 
Content-Type: application/x-javascript 

Trả lời

0

chính sách bảo mật của trình duyệt 'Live HTTP header của' có thể chặn phản hồi của bạn vì bạn chưa đặt:

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials","true"); 

Nếu điều đó không giúp, hãy thử thêm

xhrFields: { withCredentials: true } 

để ajax lựa chọn của bạn cũng có thể là giá trị một shot.

55

Thứ nhất, một chút nền:

Bạn đang sử dụng Access-Control-Allow-Headers, trong đó nêu rõ mà yêu cầu tiêu đề khách hàng được phép gửi, nhưng bạn không chỉ định mà phản ứng tiêu đề khách hàng là được phép đọc. Để cho phép khách hàng đọc các tiêu đề phản hồi không đơn giản, bạn cần sử dụng Access-Control-Expose-Headers. Từ số HTML5 Rocks CORS page:

Trong khi yêu cầu CORS, phương thức getResponseHeader() chỉ có thể truy cập vào tiêu đề phản hồi đơn giản. tiêu đề phản ứng đơn giản được định nghĩa như sau:

  • Cache-Control
  • Content-Language
  • Content-Type
  • Expires
  • Last Modified
  • pragma

Nếu bạn muốn khách hàng có thể truy cập các tiêu đề khác, bạn phải sử dụng Access-Control-Expose-Headers tiêu đề.Giá trị của tiêu đề này là danh sách các tiêu đề phản hồi được phân tách bằng dấu phẩy mà bạn muốn hiển thị cho khách hàng.

Vì vậy, cho rằng thông tin mới, bạn có thể làm:

HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "Set-Cookie"); 

... nhưng có nhiều điều hơn thế.

Bây giờ, câu trả lời thực tế:

Có thêm một vấn đề nghiêm trọng ở đây: các đặc điểm kỹ thuật XHR explictily disallows reading Set-Cookie. Đó là vì đây là một cuộc tấn công đánh cắp cookie tên miền chéo .

Giả sử miền A thực hiện yêu cầu tên miền chéo B. Khi miền B đặt cookie, tên miền sẽ đặt cookie theo tên miền cho tên miền B chỉ. Bất kỳ nỗ lực nào của miền A để đọc cookie của miền B đều vi phạm chính sách cùng nguồn gốc để truy cập cookie.

Tôi không biết WCF, vì vậy tôi không chắc chắn cách tốt nhất để thực sự làm những gì bạn muốn, nhưng tôi đoán giải pháp có thể là chuyển mã thông báo xác thực không thông qua cookie (ví dụ: tiêu đề X-WCF-Auth?) mà tên miền A đọc và sau đó đặt cookie của riêng nó.

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