web-dev-qa-db-ja.com

Internet Explorer 11はAuthorizationヘッダーを置き換えます

Internet ExplorerがHTTPヘッダーを置き換える原因

Authorization : Bearer <server-provided-token>

Authorization : Negotiate <some token>

AJAXリクエスト?

詳細

Internet Explorerでは、ヘッダーを含むように構成されている一部のAJAXリクエストAuthorization: Bearer ...はInternet ExplorerによってヘッダーAuthorization: Negotiate ...代わりに。

たとえば、Fiddlerは、3つのリクエストの最初の2つにAuthorization : Bearer...ヘッダー、3番目のヘッダーには突然Authorization : Negotiate...ヘッダー。最初の2つの要求は成功し、3番目の要求は、要求を適切に認証できないために失敗します。

すべての要求は同じクライアント側コードを使用して構築され、次々に(1秒の範囲内で)行われます。リクエストがブラウザに提供されるまで、Authorizationヘッダーに3つのケースすべてでBearerトークンが正しく含まれていることを確認しました。

また、Chromeでも同じ動作は見られません。 IEでのみ発生します。

リクエスト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 
リファラーます。http:[。____] //localhost/client/login.html言語は受け入れ:[。____] EN-US受け入れエンコード:gzipで、 deflate 
ユーザーエージェント:Mozilla/5.0(Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)Gecko 
 Host:localhost 
 DNT:1 
接続:キープアライブ

リクエスト2

 POST http:// localhost/myapp/api/Permissions HTTP/1.1 
参照元:http:// localhost/client /#/ Dashboard 
 Content-Type:application/json 【.____。]権限:[。____】ベアラoEXS5IBu9huepzW6jfh-POMA18AUA8yWZsPfBPZuFf_JJxq-DKIt0JDyPXSiGpmV_cpT8FlL3D1DN-Tv5ZbT73MTuBOd5y75-bsx9fZvOeJgg04JcO0cUajdCH2h5QlMP8TNwgTpHg-TR9FxyPk3Kw6bQ6tQCOkOwIG_FmEJpP89yrOsoYJoCfrAoZ7M4PVcik9F9qtPgXmWwXB2eHDtkls44wITF_yM_rPm5C47OPCvMVTPz30KwoEPi6fHUcL3qHauP-v9uypv2e48TyPHUwLYmNFxyafMhBx4TkovnRcsdLHZiHmSjMq0V9a2Vw70受け入れ:アプリケーション/ JSON、text/plainで、*/* 
のAccept-言語:エンUS 
 Accept-Encoding:gzip、deflate 
 User-Agent:Mozilla/5.0(Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)Gecko 
 Host:localhostのように
 Content-Length:1419 
 DNT:1 
 Connection:Keep-Alive 
 Pragma:no-cache 
 
 <Post削除されたデータ> 

リクエスト

 GET http:// localhost/myapp/api/UserPreferences/Dashboard HTTP/1.1 
参照元:http:// localhost/client /#/ Dashboard 
 Content-Type:application /json
Authorization:ネゴシエートYHsGBisGAQUFAqBxMG + gMDAuBgorBgEEAYI3AgIKBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHqI7BDlOVExNU1NQAAEAAACXsgjiBgAGADMAAAALAAsAKAAAAAYBsR0AAAAPVk1ERVZFTlYtU1JTQ0VSSVM = 
受け入れ:アプリケーション/ JSON、text/plainで、*/* 
のAccept-言語:[。____] EN-US受け入れ-エンコード:gzip、deflate 
ユーザーエージェント:Mozilla/5.0(Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)Gecko 
接続:Keep-Alive 
 DNT:1 
ホスト:localhost 

要求は、AngularJS $httpサービス、およびバックエンドはIISでホストされるASP.NET Web APIです。

35
shrichards

Internet Explorerが資格情報をキャッシュしているという問題がありました。次のスクリプトを使用して問題を修正できます。

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

参照: ウィキペディア

17
Dennis Ziegan

私もこの問題に出くわしました。

奇妙なことは、それが私の開発マシンでうまく機能したことです。それを展開したときに問題が発生しました。繰り返しになりますが、Chrome、Firefoxなどで正常に機能しました。

問題は、IEはサイトがlocalintranetゾーンにあることを検出していたため、自動的にログオンを試行しようとしていたことです(グループポリシーによって設定されました-これは内部アプリです) 。

私の回避策は、(幸いなことに)FQDNではないサーバー名(例:myserver)を使用する場合にのみローカルイントラネットゾーンを自動検出することでしたが、完全なA

6
BrettH

Knockoutjsアプリケーションでも同じ問題が発生しました。ChromeとFirefoxでは正常に動作しましたが、IEでは動作しませんでした。

また、Fiddlerを使用しましたが、最初のajax呼び出しでは意図どおりBearerが使用され、正常に返されました。しかし、その後IEはループを開始し、代わりにNegotiate認証を使用して後続のajax呼び出しを繰り返し送信します!

私の場合、それはIEの何らかのタイミングの問題であり、レンダリングの同期中にデータをロードするajax呼び出しを行うことで解決しました。

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

angularアプリで複数のデータロードを開始したときにも、この問題が発生しました。

ブラウザを検出することでこれを回避し、IEの場合、呼び出しのインデックスに基づいて各リクエストを50ミリ秒遅延させました。

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);
});

興味深いことに、$timeout、遅延を100msに増やす必要がありました。

4
pilkingk

angular and web api。で同様の問題に直面しました。システムがWindows認証が有効になっているルートレベルでリソースにアクセスしようとすると問題が発生します。この場合、アプリケーションはファビコンを取得しようとしましたfrom IIS root。このリクエストが無許可になると、IEはネゴシエーションヘッダー付きのリソースを取得しようとしますが、再び失敗します。しかし、この時点から、 IEベアラートークンの代わりにネゴシエートヘッダーを送信し続けます。これはIEの設定によるものです。InternetOptions-> Advancedタブ-> Enable Integrated Windows Authentication in the Securityセクション(わからない、正確なものを忘れてしまった)。

修正は、アプリがアクセスしようとしているルートレベルまたはリソースの場所への匿名アクセスを許可するか(悪いオプション)、またはdocument.execCommand( 'ClearAuthenticationCache'、false); app.jsファイル内。

3
Developer

私の場合、IEは、不正な要求を送信し、その後に2回目の試行で適切な要求を送信し、その後に不正な要求を再度送信するなど)を交互に行います。

IEを再試行するためのいくつかのアプローチを試した後、Locationヘッダーに同じリクエストURLで307(一時リダイレクト)を返すと問題が解決するようです。

例えば「 http:// myUrl/api/service / 」へのリクエスト

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

IEは、適切なデータで呼び出しを再試行します。

編集:この方法は、無限ループを作成する可能性があるため危険です。これを回避するための可能な解決策は、LocationヘッダーのURLの一部としてカウンターを返し、再度コールを受信したときにそれを分析することです。

0
Jimbidf