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です。
Internet Explorerが資格情報をキャッシュしているという問題がありました。次のスクリプトを使用して問題を修正できます。
document.execCommand('ClearAuthenticationCache', 'false');
参照: ウィキペディア
私もこの問題に出くわしました。
奇妙なことは、それが私の開発マシンでうまく機能したことです。それを展開したときに問題が発生しました。繰り返しになりますが、Chrome、Firefoxなどで正常に機能しました。
問題は、IEはサイトがlocalintranetゾーンにあることを検出していたため、自動的にログオンを試行しようとしていたことです(グループポリシーによって設定されました-これは内部アプリです) 。
私の回避策は、(幸いなことに)FQDNではないサーバー名(例:myserver)を使用する場合にのみローカルイントラネットゾーンを自動検出することでしたが、完全なA
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) {
...
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に増やす必要がありました。
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ファイル内。
私の場合、IEは、不正な要求を送信し、その後に2回目の試行で適切な要求を送信し、その後に不正な要求を再度送信するなど)を交互に行います。
IEを再試行するためのいくつかのアプローチを試した後、Locationヘッダーに同じリクエストURLで307(一時リダイレクト)を返すと問題が解決するようです。
例えば「 http:// myUrl/api/service / 」へのリクエスト
HTTP 307 Temporary Redirect
Location: http://myUrl/api/service/
IEは、適切なデータで呼び出しを再試行します。
編集:この方法は、無限ループを作成する可能性があるため危険です。これを回避するための可能な解決策は、LocationヘッダーのURLの一部としてカウンターを返し、再度コールを受信したときにそれを分析することです。