8

Hier ist das Szenario:Web API 2.1 Windows-Authentifizierung CORS Firefox

ich ein Web-API-Projekt erstellt und ein MVC-Projekt, etwa so:

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

I CORS-Support über nuget installiert und hinzugefügt die EnableCorsAttribute

Ich lief das Projekt und alles funktionierte wie erwartet (GET, PUT und POST) über Chrome, IE und FireFox.

Ich habe dann Windows-Authentifizierung im Web-API-Projekt aktiviert (ja, ich brauche wirklich Auth im API-Projekt zu gewinnen). Um dies zu erhalten zu arbeiten, habe ich die xhrFields meiner jQuery.ajax Anruf arg:

 $.ajax({ 
      type: method, 
      url: serviceUrl, 
      data: JSON.stringify(foo), 
      contentType: 'application/json; charset=UTF-8', 
      xhrFields: { 
       withCredentials: true 
      } 
     }).done(function (data) { 
      $('#value1').text(data); 
     }).error(function (jqXHR, textStatus, errorThrown) { 
      $('#value1').text(jqXHR.responseText || textStatus); 
     }); 

Außerdem habe ich die EnableCorsAttribute.SupportsCredentials Eigenschaft = true

ich alles getestet werden. Chrome und IE funktionierten, FireFox nicht. Firefox erhält eine 401 als Antwort auf seine Preflight (OPTIONS) Anfrage.

Es scheint, als ob FireFox keinen Versuch unternimmt, sich mit dem Dienst zu authentifizieren.

Hat jemand eine Lösung für dieses Problem gefunden?

Antwort

7

Ich habe eine 2-teilige Lösung gefunden.

Das Problem besteht darin, dass wenn Firefox eine OPTION-Anfrage absetzt und eine 401 verweigert wird, es keinen weiteren Versuch unternimmt, sich erneut zu authentifizieren. Dies führte mich zu einem Pfad, um die Authentifizierung bei allen OPTION-Anfragen zu umgehen. Ich nicht viele Informationen zu diesem Thema finden konnte, aber ich habe diese finden:

401 response for CORS request in IIS with Windows Auth enabled

auf dieser Grundlage, habe ich Anonyme Authentifizierung auf Aktiviert im api Projekteinstellungen festgelegt (I noch hatte auch die Windows Authentifizierung auf aktiviert).

Nach dem Ausführen der Projekte (mvc und api), wurde ich aufgefordert, Anmeldeinformationen beim Ausgeben einer CORS-Anfrage. Nachdem ich meine Zugangsdaten erhalten hatte, konnte ich GET/POST/PUTS mit Firefox erfolgreich erstellen.

Um die Aufforderung der Anmeldeinformationen in Firefox zu beseitigen, erhielt ich einen Tipp von Brock Allen, die mich den Weg der Aktivierung der NTLM-Authentifizierung führte. Ich habe einen Beitrag gefunden here, der Anweisungen zur Änderung der entsprechenden Einstellungen bietet.

Nach dem Hinzufügen ‚http://localhost‘ zur network.negotiate-auth.trusted-uris Einstellung, ich bin jetzt in der Lage CORS-Anfragen gegen alle Verben zur Ausgabe von Firefox ohne Anmeldeinformationen aufgefordert.

+0

Ich habe gerade einen Kommentar zu dem von Ihnen verlinkten SO-Thread gepostet. Auch wenn die Windows-Authentifizierung aktiviert ist, können Sie für den integrierten IIS 7+ -Modus ordnungsgemäß auf CORS-Preflight-Anforderungen in Ihrem HTTP-Modul reagieren. –

0

Ich löse derzeit dieses Problem und die Lösung der Anonymous-Authentifizierung war etwas, das ich nicht wirklich mochte. So etwas zu kämpfen habe ich die richtige Kombination in diesem answer beschrieben gefunden. Ich bin immer noch nicht 100% glücklich, ich möchte den Code in der globalen asax vermeiden, aber durch die Web-Konfiguration habe ich Jet nicht gelungen.

Ich hoffe, dass dies helfen kann.