WebAPI CORS mit Windows-Authentifizierung - Anonymen OPTIONS-Anfrage
Ich habe eine WebAPI 2 REST-service läuft mit Windows-Authentifizierung. Es gehostet wird, getrennt von der website, so habe ich aktiviert CORS mit dem ASP.NET CORS NuGet-Paket. Meine client-Seite ist mit AngularJS.
So weit, hier ist, was ich durchgemacht habe:
- Ich nicht withCredentials festgelegt werden, damit die CORS-Anfragen waren wieder ein 401. Gelöst, indem withCredentials zu meinem $httpProvider config.
- Nächsten hatte ich meine EnableCorsAttribute mit einer wildcard Herkunft, was nicht erlaubt bei Verwendung von Anmeldeinformationen. Gelöst, indem die Einstellung der expliziten Liste der Herkunftsländer.
- Diese aktiviert meine GET-Anforderungen, um erfolgreich zu sein, aber mein BEITRAG gab eine preflight-Anfrage, und ich hatte nicht irgendwelche controller-Aktionen zu unterstützen, die OPTIONEN, verb. Um dies zu beheben, habe ich implementiert MessageHandler als Globale OPTIONEN handler. Es gibt einfach 200 für alle OPTIONS-Anfrage. Ich weiß, das ist nicht perfekt, funktioniert aber für jetzt, in Fiddler.
Wo ich stecken geblieben bin - mein Winkel-preflight-Aufrufe nicht einschließlich der Anmeldeinformationen. Nach diese Antwort, dies ist by design, da OPTIONEN-Anforderungen ausgelegt sind, werden anonym. Aber die Windows-Authentifizierung stoppen, die Anforderung mit einem 401.
Habe ich versucht, indem Sie die [AllowAnonymous] - Attribut auf meinem MessageHandler. Auf meinem dev-Rechner, es funktioniert - OPTIONEN Verben benötigen keine Authentifizierung, aber auch andere Verben tun. Wenn ich das erstellen und bereitstellen der test-server, allerdings bin ich weiterhin um 401 auf meine OPTIONS-Anfrage.
Ist es möglich, mit [AllowAnonymous] auf meine MessageHandler, wenn die Windows-Authentifizierung verwenden? Wenn ja, eine Anleitung, wie Sie dies tun? Oder ist das der falsche Hase Loch und ich suchen sollte, auf einen anderen Ansatz?
UPDATE:
Ich war in der Lage, es zu arbeiten, indem Sie die Einstellung Windows-Authentifizierung und Anonymen Authentifizierung auf der Website im IIS. Dies führte alles zu erlauben, anonym, so dass ich Hinzugefügt habe, einen globalen filter zu Genehmigen, unter Beibehaltung der AllowAnonymous auf meine MessageHandler.
Jedoch, dies fühlt sich wie ein hack...ich hab es immer so verstanden, dass nur eine Authentifizierungsmethode verwendet werden (nicht gemischt). Wenn jemand einen besseren Lösungsansatz, wäre ich dankbar davon zu hören.
- Sie sollten wahrscheinlich hinzufügen ein tag wie "selfhost' oder 'owin' dies ist nicht gebunden an etwas wie IIS. 🙂
- Ich habe diesen guide codeproject.com/Articles/1119206/... (veröffentlicht im Jahr 2016), die sehr ähnlich mit den meisten Antworten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich verwendet self-hosting mit HttpListener und folgende Lösung für mich gearbeitet:
Ich habe gekämpft, für eine Weile, um CORS-Anfragen Arbeit innerhalb der folgenden Einschränkungen (sehr ähnlich wie die des OP):
Meine Letzte Konfiguration ist die folgende:
web.config - erlauben den nicht authentifizierten (anonymen) preflight-Anforderungen (OPTIONEN)
global.asax.cs - richtig Antwort mit Header, die es ermöglichen, Anrufer von einer anderen Domäne aus, um Daten zu empfangen
CORS aktivieren
Dies ist eine viel einfachere Lösung-ein paar Zeilen code, damit alle "OPTIONEN" - Anfragen effektiv zu imitieren, die app-pool-Konto. Sie können Anonyme Ausgeschaltet, und konfigurieren CORS-Richtlinien pro normalen Verfahren, aber fügen Sie den folgenden, um Ihre globalen.asax.cs:
Ich löste es in einer sehr ähnlichen Weise, aber mit einigen details und konzentriert sich auf die oData-service -
Wusste ich nicht, deaktivieren Sie die anonyme Authentifizierung in IIS, da brauchte ich es zur POST-Anforderung
Und ich habe in "Global".aspx (Hinzufügen
MaxDataServiceVersion
imAccess-Control-Allow-Headers
) den gleichen code als obensowie
WebAPIConfig.cs
und AngularJS nennen
Dave,
Nach Herumspielen mit der CORS-Paket, das ist, was verursacht, dass es funktioniert für mich: [EnableCors(Ursprung: "", Header: "", Methoden: "*", SupportsCredentials=true)]
Musste ich aktivieren SupportsCredentials=true. Ursprünge,Kopf -, und Methoden sind alle auf den "*"
deaktivieren Sie die anonyme Authentifizierung in IIS, wenn Sie es nicht brauchen.
Als fügen Sie diese in Ihrem global asax:
Stellen Sie sicher, dass, wo du cors aktivieren Sie aktivieren auch die Berechtigung Gebrauch, wie:
Wie Sie sehen können ich ermöglichen CORS weltweit und über die Anwendung BeginRequest-Haken authentifizieren ich alle OPTIONEN, die Anträge für die api (Web-Api) und die odata-Anfragen (wenn Sie es).
Dieser funktioniert mit allen Browsern, die in der client-Seite, vergessen Sie nicht, die xhrFiled withCredentials wie unten gezeigt.
Ich versuche zu finden, eine andere Lösung zu vermeiden, verwenden Sie den Haken, aber ohne Erfolg bis jetzt
Ich würde das Internet nutzen.config-Konfiguration zu tun, so etwas wie die folgenden:
WARNUNG DIE FOLGENDE KONFIGURATION FUNKTIONIERT NICHT!
Anderen Lösungen, die ich im web gefunden habe nicht für mich arbeiten, oder schien zu hacky; am Ende kam ich auf eine einfachere und funktionierende Lösung:
web.config:
Projekt Eigenschaften:
Windows Authentication
Anonymous Authentication
Setup CORS:
Diese erfordert Microsoft.Owin.Cors-assembly, die ist verfügbar auf NUget.
Winkel-Initialisierung:
Dies ist meine Lösung.
Global.asax*
In unserer situation:
fanden wir, dass die Lösung woanders:
In Web.Config alles, was wir zu tun hatten, war, fügen runAllManagedModulesForAllRequests= " true
Landeten wir zu dieser Lösung durch nach einer Lösung, warum der Application_BeginRequest wurde nicht ausgelöst wird.
Den anderen Konfigurationen, die wir hatten:
in Web.Config
in WebApiConfig
BTW "*" cors Herkunft ist nicht kompatibel mit Windows-Authentifizierung /SupportCredentials = true
https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api#pass-credentials-in-cross-origin-requests