WebAPI CORS mit Windows-Authentifizierung - Anonyme OPTIONS-Anfrage zulassen

9

Ich habe einen WebAPI 2 REST-Dienst, der mit der Windows-Authentifizierung ausgeführt wird. Es wird separat von der Website gehostet, also habe ich CORS mit dem ASP.NET CORS NuGet-Paket aktiviert. Meine Client-Site verwendet AngularJS.

Bis jetzt, hier ist, was ich durchgemacht habe:

  1. Ich hatte withCredentials nicht gesetzt, also gaben die CORS-Anfragen eine 401 zurück. Gelöst durch Hinzufügen von withCredentials zu meiner $ httpProvider-Konfiguration.
  2. Als Nächstes hatte ich mein EnableCorsAttribute mit einem Platzhalterursprung festgelegt, der bei der Verwendung von Anmeldeinformationen nicht zulässig ist. Gelöst durch Einstellen der expliziten Liste von Ursprüngen.
  3. Dadurch konnten meine GET-Anfragen gelingen, aber mein POST gab eine Preflight-Anfrage aus, und ich hatte keine Controller-Aktionen zur Unterstützung des OPTIONS-Verbs erstellt. Um dies zu beheben, habe ich einen MessageHandler als globalen OPTIONS-Handler implementiert. Es gibt einfach 200 für jede OPTIONS-Anfrage zurück. Ich weiß, das ist nicht perfekt, aber funktioniert jetzt, in Fiddler.

Wo ich feststecke - meine Angular-Preflight-Anrufe enthalten keine Zugangsdaten. Laut dieser Antwort ist dies beabsichtigt, da OPTIONS-Anfragen anonymisiert sind. Die Windows-Authentifizierung stoppt jedoch die Anforderung mit einem 401.

Ich habe versucht, das Attribut [AllowAnonymous] auf meinen MessageHandler zu setzen. Auf meinem Entwicklungscomputer funktioniert es - OPTIONS-Verben erfordern keine Authentifizierung, aber andere Verben tun es. Wenn ich Build und Bereitstellung auf dem Testserver jedoch bin, erhalte ich weiterhin eine 401 für meine OPTIONS-Anfrage.

Kann ich [AllowAnonymous] auf meinem MessageHandler anwenden, wenn ich die Windows-Authentifizierung verwende? Wenn ja, irgendeine Anleitung dazu? Oder ist das das falsche Kaninchenloch, und ich sollte einen anderen Ansatz betrachten?

UPDATE: Ich konnte es zum Laufen bringen, indem ich sowohl die Windows-Authentifizierung als auch die anonyme Authentifizierung auf der Site in IIS festlegte. Dies führte dazu, dass alles anonym möglich war, also habe ich einen globalen Filter von Authorize hinzugefügt, während ich AllowAnonymous auf meinem MessageHandler behalte.

Das fühlt sich jedoch an wie ein Hack ... Ich habe immer verstanden, dass nur eine Authentifizierungsmethode verwendet werden sollte (nicht gemischt). Wenn jemand einen besseren Ansatz hat, würde ich es begrüßen.

    
Dave Simione 11.12.2014, 02:37
quelle

8 Antworten

12

Ich habe Self-Hosting mit HttpListener verwendet und folgende Lösung funktionierte für mich:

  1. Ich erlaube anonyme OPTIONS Anfragen
  2. Aktivieren Sie CORS mit SupportsCredentials setzen Sie
%Vor%     
Igor Tkachenko 24.03.2015 13:00
quelle
2

Dies ist eine viel einfachere Lösung - ein paar Zeilen Code, damit alle "OPTIONS" -Anfragen den App-Pool-Account effektiv imitieren können. Sie können Anonymous ausgeschaltet lassen und die CORS-Richtlinien gemäß den normalen Verfahren konfigurieren. Fügen Sie dann jedoch Folgendes zu Ihrer Datei global.asax.cs hinzu:

%Vor%     
willman 03.06.2016 17:37
quelle
2

Ich habe es auf sehr ähnliche Weise gelöst, aber mit einigen Details und dem oData-Service

Ich habe die anonyme Authentifizierung in IIS nicht deaktiviert, da ich sie für die POST-Anforderung benötigt habe

Und ich habe in Global.aspx (Hinzufügen von MaxDataServiceVersion in Access-Control-Allow-Headers ) denselben Code wie oben

hinzugefügt %Vor%

und WebAPIConfig.cs

%Vor%

und AngularJS rufen

auf %Vor%     
Fran Rodriguez 27.10.2015 10:06
quelle
2

Ich habe eine Weile damit zu kämpfen gehabt, dass CORS-Anfragen innerhalb der folgenden Einschränkungen funktionieren (sehr ähnlich denen der OPs):

  • Windows-Authentifizierung für alle Benutzer
  • Keine anonyme Authentifizierung erlaubt
  • Funktioniert mit IE11, das in einigen Fällen nicht funktioniert sende CORS-Preflight-Anfragen (oder erreiche zumindest nicht global.asax BeginRequest als OPTIONS-Anfrage)

Meine letzte Konfiguration ist die folgende:

web.config - erlauben Sie nicht authentifizierte (anonyme) Preflight-Anfragen (OPTIONS)

%Vor%

global.asax.cs : Beantworten Sie die Header korrekt, damit Anrufer aus einer anderen Domäne Daten empfangen können

%Vor%

CORS-Aktivierung

%Vor%     
Alexei 23.01.2017 13:30
quelle
0

Dave,

Nachdem ich mit dem CORS-Paket herumgespielt habe, hat es dafür gesorgt, dass es für mich funktioniert: [EnableCors (Ursprung: "", Header: "", Methoden: "*", ) SupportsCredentials = true )]

Ich musste SupportsCredentials = true aktivieren. Ursprünge, Header und Methoden sind alle auf "*"

gesetzt     
jr3 15.12.2014 15:15
quelle
0

deaktivieren Sie die anonyme Authentifizierung in IIS, wenn Sie sie nicht benötigen.

Fügen Sie das in Ihrem globalen asax hinzu:

%Vor%

Stellen Sie sicher, dass Sie bei Aktivierung von cors auch die Verwendung von Anmeldeinformationen aktivieren, z. B.

%Vor%

Wie Sie sehen können, aktiviere ich CORS global und benutze den BeginRequest -Hook der Anwendung. Ich beglaubige alle OPTIONS-Anfragen für die API (Web API) und die OData-Anfragen (wenn du sie verwendest).

Dies funktioniert mit allen Browsern gut, auf der Client-Seite denken Sie daran, das xhrFiled mitCredentials hinzuzufügen, wie unten gezeigt.

%Vor%

Ich versuche eine andere Lösung zu finden, ohne den Haken zu benutzen, aber bis jetzt ohne Erfolg, Ich würde die Konfiguration von web.config verwenden, um Folgendes zu tun: WARNUNG DIE KONFIGURATION UNTEN FUNKTIONIERT NICHT!

%Vor%     
Manuel 17.04.2015 13:56
quelle
0

Andere Lösungen, die ich im Internet gefunden habe, funktionierten nicht für mich oder schienen zu hackig zu sein; Am Ende habe ich eine einfachere und funktionierende Lösung gefunden:

web.config:

%Vor%

Projekteigenschaften:

  1. Aktivieren Sie Windows Authentication
  2. Deaktiviere Anonymous Authentication

Setup CORS:

%Vor%

Dies erfordert die Microsoft.Owin.Cors-Assembly, die in NUget verfügbar ist.

Winkelinitialisierung:

%Vor%     
Vedran 26.01.2016 09:34
quelle
0

Das ist meine Lösung.

Global.asax *

%Vor%     
Dblock247 05.02.2018 20:08
quelle