2015-02-19 11 views
26

Was Internet Explorer verursachen würde den HTTP-HeaderInternet Explorer 11 ersetzt Authorization-Header

Authorization : Bearer <server-provided-token>

mit

Authorization : Negotiate <some token>

ersetzen, wenn eine Anfrage AJAX machen?

Einzelheiten

im Internet Explorer einige AJAX-Anfragen, die von Internet Explorer mit dem Header gesendet, um den Header Authorization: Bearer ... werden Authorization: Negotiate ... stattdessen enthalten konfiguriert sind.

Zum Beispiel zeigt Fiddler, dass die ersten zwei von drei Anfragen den Header Authorization : Bearer... enthalten, während der dritte plötzlich den Header Authorization : Negotiate... enthält. Die ersten beiden Anforderungen sind erfolgreich und die dritte schlägt fehl, da die Anforderung nicht ordnungsgemäß authentifiziert werden kann.

Alle Anforderungen werden mit demselben clientseitigen Code erstellt und nacheinander (innerhalb einer Sekunde) erstellt. Ich habe überprüft, dass der Header Authorization korrekt das Token Bearer in allen drei Fällen enthält, bis zu dem Punkt, an dem die Anfrage an den Browser gesendet wird.

Auch sehe ich nicht das gleiche Verhalten in Chrome; Es tritt nur in IE auf.

Antrag 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 

Antrag 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> 

Antrag 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 

Die Anforderungen werden über den Dienst AngularJS $http hergestellt werden, und das Back-End ist die in IIS gehostete ASP.NET-Web-API.

+0

Hallo Shrichards - hast du das jemals herausgefunden? Ich scheine das gleiche Problem mit IE 11 zu begegnen. –

+0

@JoshuaBarron Ich war nie in der Lage, die Ursache des Problems zu ermitteln.Ich habe das Problem gelöst, indem ich einen separaten Service mit der alleinigen Verantwortung für die Ausgabe von Tokens eingerichtet habe. In IIS wurde dieser Token-Dienst so konfiguriert, dass er sowohl die Windows- als auch die anonyme Authentifizierung unterstützt. Der Dienst, der die Token für die Authentifizierung verwendet hat, wurde dann so konfiguriert, dass die anonyme Authentifizierung nur in IIS verwendet wird (da die Authentifizierung über die Token in der Middleware erfolgte). Dies verhinderte, dass IE versuchte, eine integrierte Authentifizierung mit IIS durchzuführen, wenn auf den gesicherten Dienst zugegriffen wurde. – shrichards

+0

Würden Sie bitte ein ausführlicheres Beispiel geben, wie Sie diesen Service gemacht haben (in Github oder Pastebin). Ich habe mehr als zwei Wochen mit diesem Problem verloren und kann immer noch keinen Workaround finden. Danke im Voraus. – Martin

Antwort

5

Ich hatte das gleiche Problem in einer Knockoutjs-Anwendung, es funktionierte gut in Chrome und Firefox, aber nicht in IE.

Ich benutzte auch Fiddler und bemerkte, dass der erste Ajax-Aufruf Bearer wie beabsichtigt verwendet und erfolgreich zurückgegeben wurde. Aber dann begann IE zu loopen und die nachfolgenden Ajax-Aufrufe immer wieder mit der Negotiate-Berechtigung zu senden!

In meinem Fall war es eine Art von Timing-Problem in IE, ich löste es, indem Sie die Ajax-Aufrufe, die Daten während des Rendern synchron geladen.

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

Wir hatten ein Problem, bei dem Internet Explorer Anmeldeinformationen zwischenspeichert.Wir konnten das Problem beheben, indem Sie das folgende Skript verwenden:

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

siehe: Wikipedia

5

ich auch über dieses Thema gerade gekommen sind.

Was seltsam war, dass es auf meiner Entwicklungsmaschine gut funktionierte, war es, als ich es einsetzte, entstand das Problem. Erneut funktionierte es in Chrome, Firefox usw.

Es stellt sich heraus, dass IE erkannte die Website war in der LocalIntranet-Zone und versuchte daher automatisch versuchen, anmelden (es wurde von Gruppenrichtlinien eingestellt - Dies ist eine interne App).

Meine Abhilfe war, dass (zum Glück) nur lokale Intranetzone Auto-Erkennung wurde, als einen Servernamen verwenden, der nicht ein FQDN war (zB myserver) - aber im Voll A

4

ich auch dieses Problem auftreten, wenn ich löste mehrere Datenladungen in meiner eckigen App aus.

ich durch Erfassen des Browsers und wenn IE um dies funktioniert, verzögert jede Anfrage von 50ms basierend auf dem Index des Gesprächs:

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

Interessant ist, wenn ich $timeout verwendet, musste ich die Verzögerung erhöhen 100ms.

+0

Leider scheint dies nur zu funktionieren, wenn die Seite NICHT beim ersten Laden der Seite aktualisiert wird. Immer noch untersucht ... – pilkingk

+0

Haben Sie jemals eine Lösung gefunden? Ich habe das gleiche Problem und implementiert eine leicht zufällige Verzögerung für jede Anfrage und progressiv verzögerte Wiederholungen. Dies half, aber löste das Problem nicht vollständig –

1

Wir hatten ähnliche Probleme mit eckigen und Web-API konfrontiert. Problem tritt auf, wenn das System versucht, auf eine Ressource auf Root-Ebene zuzugreifen, für die Windows-Authentifizierung aktiviert ist. In unserem Fall versuchte die Anwendung, das Favicon vom IIS-Root zu beziehen. Sobald diese Anfrage unautorisiert wird, wird IE versuchen, die Ressource mit dem Verhandlungs-Header zu bekommen; obwohl es wieder fehlschlägt. Aber ab diesem Zeitpunkt sendet IE weiterhin einen Verhandlungs-Header anstelle unseres Bearer-Tokens. Dies liegt an den Einstellungen in IE, die ich denke, ist in Internetoptionen -> Registerkarte Erweitert -> Integrierte Windows-Authentifizierung aktivieren im Bereich Sicherheit (nicht sicher, ich habe die genauen Sachen vergessen).

Fix wurde entweder geben anonymen Zugriff auf Root-Ebene oder auf den Speicherort der Ressource, auf die app versucht zuzugreifen (schlechte Option) oder document.execommand ('ClearAuthenticationCache', false); in der Datei app.js.

+0

_document.execCommand ('ClearAuthenticationCache', false); in der app.js file._ Was meinst du? Nach meinem Verständnis ist Code nur relevant, um den Authentifizierungscache für die Standardauthentifizierung und nicht für Windows zu löschen. Und wo würden Sie diesen Code in Ihre Angular App einfügen? Es müsste sein, nachdem Sie von den IWA-geschützten Ressourcen anfordern, aber bevor Sie von Anon-Ressourcen richtig anfordern? –

+0

@PeterM - Ich möchte diesen Code in Ihrem Hauptmodul/Controller haben. AFAIK, sobald eine Anfrage 401 erreicht (wenn versucht wird, auf eine Ressource zuzugreifen, die mit Windows-Authentifizierung geschützt ist), versucht der IE, diese Ressource erneut zu treffen, indem er Token aushandelt. Und danach speichert der IE das Token und sendet dieses Token für alle nachfolgenden Anfragen. Dies liegt an der Einstellung in IE (wenn ich mich recht erinnere), die ich in der Antwort erwähnt habe. Könnten Sie bitte das Verhalten im Netzwerk Tab überprüfen? Geht das Verhandlungstoken weiter, nachdem die Anforderung mit 401 fehlerhaft ist? – Developer

+0

@PeterM - Stehen Sie auch nach dem clearCache-Code immer noch vor dem Problem? – Developer

0

In meinem Fall wechselte IE zwischen dem Senden einer schlechten Anfrage, gefolgt von einer guten Anfrage bei einem zweiten Versuch, gefolgt von einer schlechten Anfrage und so weiter.

Nachdem Sie mehrere Versuche versucht haben, IE erneut zu versuchen, scheint die Rückgabe eines 307 (Temporary Redirect) mit der gleichen Request-URL im Location-Header das Problem zu lösen.

z.B. für einen Antrag auf „http://myUrl/api/service/

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

IE wiederholt den Aufruf mit den richtigen Daten.

Bearbeiten: Diese Methode kann gefährlich sein, da sie eine Endlosschleife erstellen könnte. Eine mögliche Lösung, um dies zu umgehen, besteht darin, einen Zähler als Teil der URL im Location-Header zurückzugeben und diesen beim erneuten Empfangen des Anrufs zu analysieren.

Verwandte Themen