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:
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.
Ich habe Self-Hosting mit HttpListener verwendet und folgende Lösung funktionierte für mich:
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%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
und WebAPIConfig.cs
und AngularJS rufen
auf %Vor%Ich habe eine Weile damit zu kämpfen gehabt, dass CORS-Anfragen innerhalb der folgenden Einschränkungen funktionieren (sehr ähnlich denen der OPs):
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%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 "*"
gesetztdeaktivieren 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%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:
Windows Authentication
Anonymous Authentication
Setup CORS:
%Vor%Dies erfordert die Microsoft.Owin.Cors-Assembly, die in NUget verfügbar ist.
Winkelinitialisierung:
%Vor%Tags und Links asp.net-web-api angularjs cors windows-authentication