2015-02-19 22 views
26

Điều gì sẽ gây ra Internet Explorer để thay thế các tiêu đề HTTPInternet Explorer 11 thay thế Authorization tiêu đề

Authorization : Bearer <server-provided-token>

với

Authorization : Negotiate <some token>

khi thực hiện một yêu cầu AJAX?

Chi tiết

Trong Internet Explorer, một số yêu cầu AJAX được cấu hình để chứa header Authorization: Bearer ... đang được gửi bởi trình duyệt Internet Explorer với tiêu đề Authorization: Negotiate ... để thay thế.

Ví dụ: Fiddler cho thấy rằng hai trong ba yêu cầu đầu tiên chứa tiêu đề Authorization : Bearer..., trong khi thứ ba đột nhiên chứa tiêu đề Authorization : Negotiate.... Hai yêu cầu đầu tiên là thành công và yêu cầu thứ ba không thành công do yêu cầu không thể được xác thực chính xác.

Tất cả các yêu cầu được xây dựng bằng cách sử dụng client-side code giống nhau, và được thực hiện một cái khác (trong khoảng thời gian một giây). Tôi đã xác minh rằng tiêu đề Authorization có chứa mã thông báo Bearer trong cả ba trường hợp cho đến khi yêu cầu được cung cấp cho trình duyệt.

Ngoài ra, tôi không thấy hành vi tương tự trong Chrome; nó chỉ xảy ra trong IE.

Yêu cầu 1

 
GET http://localhost/myapp/api/User HTTP/1.1 
Accept: application/json, text/plain, */* 
Authorization: Bearer oEXS5IBu9huepzW6jfh-POMA18AUA8yWZsPfBPZuFf_JJxq-DKIt0JDyPXSiGpmV_cpT8FlL3D1DN-Tv5ZbT73MTuBOd5y75-bsx9fZvOeJgg04JcO0cUajdCH2h5QlMP8TNwgTpHg-TR9FxyPk3Kw6bQ6tQCOkOwIG_FmEJpP89yrOsoYJoCfrAoZ7M4PVcik9F9qtPgXmWwXB2eHDtkls44wITF_yM_rPm5C47OPCvMVTPz30KwoEPi6fHUcL3qHauP-v9uypv2e48TyPHUwLYmNFxyafMhBx4TkovnRcsdLHZiHmSjMq0V9a2Vw70 
Referer: http://localhost/client/login.html 
Accept-Language: en-US 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko 
Host: localhost 
DNT: 1 
Connection: Keep-Alive 

Yêu cầu 2

 
POST http://localhost/myapp/api/Permissions HTTP/1.1 
Referer: http://localhost/client/#/Dashboard 
Content-Type: application/json 
Authorization: Bearer oEXS5IBu9huepzW6jfh-POMA18AUA8yWZsPfBPZuFf_JJxq-DKIt0JDyPXSiGpmV_cpT8FlL3D1DN-Tv5ZbT73MTuBOd5y75-bsx9fZvOeJgg04JcO0cUajdCH2h5QlMP8TNwgTpHg-TR9FxyPk3Kw6bQ6tQCOkOwIG_FmEJpP89yrOsoYJoCfrAoZ7M4PVcik9F9qtPgXmWwXB2eHDtkls44wITF_yM_rPm5C47OPCvMVTPz30KwoEPi6fHUcL3qHauP-v9uypv2e48TyPHUwLYmNFxyafMhBx4TkovnRcsdLHZiHmSjMq0V9a2Vw70 
Accept: application/json, text/plain, */* 
Accept-Language: en-US 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko 
Host: localhost 
Content-Length: 1419 
DNT: 1 
Connection: Keep-Alive 
Pragma: no-cache 

<Post Data Removed> 

Yêu cầu 3

 
GET http://localhost/myapp/api/UserPreferences/Dashboard HTTP/1.1 
Referer: http://localhost/client/#/Dashboard 
Content-Type: application/json 
Authorization: Negotiate YHsGBisGAQUFAqBxMG+gMDAuBgorBgEEAYI3AgIKBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHqI7BDlOVExNU1NQAAEAAACXsgjiBgAGADMAAAALAAsAKAAAAAYBsR0AAAAPVk1ERVZFTlYtU1JTQ0VSSVM= 
Accept: application/json, text/plain, */* 
Accept-Language: en-US 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko 
Connection: Keep-Alive 
DNT: 1 
Host: localhost 

Các yêu cầu là được thực hiện thông qua dịch vụ AngularJS $http và back-end là ASP.NET Web API được lưu trữ trong IIS.

+0

Hi shrichards - bạn đã bao giờ tìm ra điều này chưa? Tôi dường như đang gặp phải sự cố tương tự với IE 11. –

+0

@JoshuaBarron Tôi chưa bao giờ có thể xác định được nguyên nhân gốc rễ của vấn đề.Tôi đã giải quyết vấn đề bằng cách tạo một dịch vụ riêng biệt với trách nhiệm duy nhất là phát hành mã thông báo. Trong IIS, dịch vụ token đó đã được cấu hình để hỗ trợ cả xác thực Windows và Anonymous. Dịch vụ sử dụng mã thông báo cho auth sau đó được cấu hình để sử dụng xác thực ẩn danh chỉ trong IIS (vì auth đã được xử lý thông qua các mã thông báo trong phần mềm trung gian). Điều này khiến IE không thể thực hiện auth tích hợp với IIS khi dịch vụ bảo mật được truy cập. – shrichards

+0

Bạn vui lòng cung cấp ví dụ chi tiết hơn về cách bạn thực hiện dịch vụ này (trong github hoặc pastebin). Tôi mất hơn hai tuần với vấn đề đó và vẫn không thể tìm được một công việc xung quanh. Cảm ơn trước. – Martin

Trả lời

5

tôi đã cùng một vấn đề trong một ứng dụng knockoutjs, nó làm việc tốt trong Chrome và Firefox nhưng không phải trong IE.

Tôi cũng sử dụng Fiddler và nhận thấy rằng các cuộc gọi ajax đầu tiên sử dụng Bearer như dự định và trở thành công. Nhưng sau đó IE bắt đầu lặp lại và gửi các cuộc gọi ajax tiếp theo lặp đi lặp lại với ủy quyền Thoả thuận thay thế!

Trong trường hợp của tôi đó là một số loại thời gian vấn đề trong IE, tôi giải quyết nó bằng cách làm cho các cuộc gọi ajax mà nạp dữ liệu trong khi hiển thị đồng bộ.

me.loadLimits = function() { 
     $.ajax({ 
     type: 'GET', 
     dataType: 'json', 
     contentType: 'application/json', 
     url: '/api/workrate/limits', 
     headers: me.headers, 
     async: false, 
     success: function (result) { 
    ... 
11

Chúng tôi gặp sự cố khi Internet Explorer đang lưu vào bộ nhớ cache thông tin đăng nhập.Chúng ta có thể khắc phục vấn đề bằng cách sử dụng các kịch bản sau đây:

document.execCommand('ClearAuthenticationCache', 'false'); 

see: Wikipedia

5

Tôi vừa mới đi qua vấn đề này quá.

là gì kỳ lạ là nó hoạt động tốt trên máy phát triển của tôi, đó là khi tôi triển khai nó vấn đề nảy sinh. Một lần nữa nó hoạt động tốt trong Chrome, Firefox, v.v.

Nó chỉ ra rằng IE đã phát hiện trang web nằm trong vùng localintranet và do đó cố gắng tự động thử đăng nhập (nó được đặt theo chính sách nhóm - đây là một ứng dụng nội bộ).

workaround của tôi là (may mắn) nó chỉ autodetecting khu intranet cục bộ khi sử dụng một tên máy chủ mà không phải là một FQDN (ví dụ myserver) - nhưng sử dụng đầy đủ Một

4

Tôi cũng gặp phải vấn đề này khi tôi đã khởi động nhiều tải dữ liệu trong ứng dụng góc của tôi.

tôi làm việc này bằng cách phát hiện các trình duyệt và nếu IE, trì hoãn mỗi yêu cầu bởi 50ms dựa trên chỉ số của cuộc gọi:

return $q(function(resolve, reject) { 
var delay = self.widget.useDelayLoading ? self.widget.index * 50 : 0; 

setTimeout(function() { 
    restService.genericApi(self.widget.url, false).queryPost(json).$promise 
    .then(
    function(r) { resolve(r); }, 
    function(e) { reject(e); } 
    ); 
}, delay); 
}); 

Điều thú vị là, khi tôi sử dụng $timeout, tôi đã phải tăng chậm trễ đến 100ms.

+0

Thật không may, điều này dường như chỉ hoạt động khi làm mới trang KHÔNG tải trên trang ban đầu. Vẫn đang điều tra ... – pilkingk

+0

Bạn đã bao giờ tìm được giải pháp chưa? Tôi có cùng một vấn đề và thực hiện một sự chậm trễ ngẫu nhiên một chút cho mỗi yêu cầu và dần dần bị trì hoãn thử lại. Điều này đã giúp, nhưng không giải quyết được hoàn toàn vấn đề –

1

Chúng tôi đã phải đối mặt với vấn đề tương tự với góc và web api. Sự cố xảy ra khi hệ thống cố truy cập một số tài nguyên ở cấp cơ sở đã bật Xác thực Windows. Trong trường hợp của chúng tôi, ứng dụng đã cố gắng lấy favicon từ gốc IIS. Sau khi yêu cầu này bị trái phép, IE sẽ cố gắng nhận được sự hỗ trợ với tiêu đề thương lượng; mặc dù nó không thành công một lần nữa. Nhưng từ thời điểm này trở đi, IE tiếp tục gửi tiêu đề thương lượng thay vì mã thông báo mang của chúng tôi. Điều này là do các thiết lập trong IE, mà tôi nghĩ là trong Internet Options -> Advanced tab -> Kích hoạt tính năng xác thực tích hợp Windows trong phần Security (không chắc chắn, tôi quên các công cụ chính xác).

Khắc phục hoặc là cấp quyền truy cập ẩn danh cho cấp gốc hoặc vị trí tài nguyên mà ứng dụng đang cố gắng truy cập (tùy chọn xấu) hoặc có document.execCommand ('ClearAuthenticationCache', false); trong tệp app.js.

+0

_document.execCommand ('ClearAuthenticationCache', false); trong tệp app.js._ Ý của bạn là gì? Sự hiểu biết của tôi là mã chỉ có liên quan để xóa bộ nhớ cache xác thực cho Xác thực cơ bản chứ không phải Windows. Và nơi bạn sẽ đặt mã đó trong ứng dụng Góc của mình? Nó sẽ phải được sau khi bạn yêu cầu từ các nguồn tài nguyên được bảo vệ IWA, nhưng trước khi bạn yêu cầu từ nguồn tài nguyên anon phải không? –

+0

@PeterM - Tôi muốn có mã đó trong mô-đun/bộ điều khiển chính của bạn. AFAIK, khi yêu cầu truy cập 401 (khi cố truy cập tài nguyên được bảo vệ bằng xác thực cửa sổ), IE sẽ cố gắng truy cập lại tài nguyên đó bằng cách sử dụng mã thông báo thương lượng. Và sau đó, IE lưu trữ mã thông báo và gửi mã thông báo đó cho tất cả các yêu cầu susequent. Điều này là do các thiết lập trong IE (nếu tôi nhớ nó đúng) mà tôi đã đề cập trong câu trả lời. Bạn có thể vui lòng xác minh hành vi trong tab mạng không? Mã thông báo thương lượng có được thực hiện sau khi yêu cầu bị lỗi với 401 không? – Developer

+0

@PeterM - Bạn vẫn gặp sự cố ngay cả sau khi có mã clearCache? – Developer

0

Trong trường hợp của tôi, IE xen kẽ giữa việc gửi một yêu cầu xấu, tiếp theo là một yêu cầu tốt về một nỗ lực thứ hai, sau đó theo sau là một yêu cầu xấu một lần nữa và vân vân.

Sau khi thử nhiều cách tiếp cận để gây IE để thử lại - dường như trở về một 307 (Chuyển hướng tạm thời) với địa chỉ yêu cầu tương tự trong tiêu đề Nơi giải quyết vấn đề này.

ví dụ: cho một yêu cầu để "http://myUrl/api/service/"

HTTP 307 Temporary Redirect 
Location: http://myUrl/api/service/ 

IE thử lại các cuộc gọi với các dữ liệu thích hợp.

Edit: Phương pháp này có thể là nguy hiểm vì nó có thể tạo ra một vòng lặp vô hạn. Một giải pháp khả thi để giải quyết vấn đề này là trả lại một số bộ đếm như một phần của url trong tiêu đề Vị trí và phân tích nó khi nhận cuộc gọi một lần nữa.

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