2015-01-30 3 views
6

Ich habe zwei Projekte; Eines ist ein MVC-Projekt, das eckige (also nicht reale MVC) verwendet, und das andere ist ein WebAPI2-Projekt, bei dem verschiedene Controller Daten an das erste Projekt übergeben und Daten davon annehmen.Aufruf von WebAPI2-Dienst von AngularJS mit NTLM-Sicherheit

Das erste Projekt wird unter Verwendung von Winkeln der http $ den WebAPI Dienst abfragen:

var request = $http({ 
     method: "GET", 
     url: "http://localhost:1234/api/Entity/", 
     json: true, 
     crossDomain: true, 
     datatype: 'json', 
     params: { action: "get" }, 
     withCredentials: true 
    }); 

Wenn dies in IE10 läuft, werden die Daten ohne Probleme überhaupt zurückgegeben. Die Ausführung in Chrome oder Firefox führt jedoch zu einem 401-Fehler. Ich habe Fiddler verwendet, um den Unterschied zwischen den Anfragen zu untersuchen, und habe ihn auf den Authorization-Header beschränkt. Der IE Anfrage sieht wie folgt aus:

GET http://localhost:1234/api/Entity?action=get 
HTTP/1.1 
Referer: http://localhost:1234/Home 
Accept: application/json, text/plain, */* 
Accept-Language: en-GB 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64;  Trident/6.0) 
Connection: Keep-Alive 
DNT: 1 
Authorization: Negotiate oXcwdaADCgEBoloEWE5UTE1TU1AAAwAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAABXCiOIGAbEdAAAAD+mN4751DVFNv2xW6c59dCajEgQQAQAAAPUXp1AtIpqEAAAAAA== 
Host: localhost:58843 

Von dem, was ich sammeln kann, wird das Format des Token gibt an, dass es NTLM-Sicherheit verwendet. Gibt es etwas, was ich tun kann, um diesen Authorization Header über die $ http Anfrage zu übergeben?

Ich kann nicht sehen, dass im WebAPI-Dienst eine Sicherheit angegeben ist (ich habe dieses Projekt in den letzten Tagen geerbt, also bin ich noch nicht vollständig vertraut); Wird der Berechtigungsheader gesendet, da es sich um eine CORS-Anfrage handelt?

Ich bin derzeit an dem Punkt, die WebAPI-Controller in das erste Projekt zu verschieben, um alle domainübergreifenden Aufrufe zu vermeiden; Vielleicht ist dies das Beste, wenn man bedenkt, dass dieser REST-Dienst nur vom MVC-Projekt aufgerufen wird?

Jede Hilfe wäre sehr willkommen!

Antwort

-1

Es scheint etwas mit der Reihenfolge der Anbieter in IIS für die Option "Windows-Authentifizierung" zu tun haben. Die "Negotiate" -Anbieter müssen aus der Liste der Anbieter entfernt werden und nur NTLM lassen. Im folgenden Artikel finden Sie eine Schritt-für-Schritt-Erklärung zum Entfernen von "Negotiate" aus der Liste der Anbieter in IIS. Es hat für mich funktioniert. Ich hoffe es tut dir. http://www.leftycoder.com/windows-authentication-chrome-iis/

+0

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (http://meta.stackoverflow.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. –

+0

Vielen Dank für das Feedback, wie Sie Antworten schreiben können. – user906573

1

Firefox (eigentlich jeder anderer Browser als IE) unterstützt keine nativen NTLM aber Sie können dies mit der Verwendung dieses Add-on zu arbeiten: https://addons.mozilla.org/en-US/firefox/addon/integrated-auth-for-firefox/

Ich benutze es und meine interne Domain Whitelist und sind in der Lage, die gleiche Art von Anrufen von eckigen zu WebApi wie mit IE zu machen. Wenn Sie den Netzwerk-Tab der Dev-Konsole sehen, werden die Verhandlungsversuche mit ein paar 401 Ablehnungen angezeigt, bevor Sie die 200 erhalten, aber das führt erst nach Abschluss der Verhandlung zu Ihrer App.

Verwandte Themen