Was ich versuche zu tun
Ich habe eine Backend-ASP.Net Core-Web-API, die auf einem Azure Free Plan gehostet wird (Quellcode: https://github.com/killerrin/Portfolio-Backend ).
Ich habe auch eine Client-Website, auf der diese API verwendet werden soll. Die Clientanwendung wird nicht auf Azure gehostet, sondern auf Github Pages oder einem anderen Webhostingdienst, auf den ich Zugriff habe. Aus diesem Grund werden die Domainnamen nicht ausgerichtet.
In diesem Zusammenhang muss ich CORS auf der Web-API-Seite aktivieren. Ich habe jedoch seit einigen Stunden so gut wie alles ausprobiert und es weigert sich zu funktionieren.
Wie ich das Client-Setup habe Es ist nur ein einfacher Client, der in React.js geschrieben ist. Ich rufe die APIs über AJAX in Jquery auf. Die React-Site funktioniert, also weiß ich, dass es das nicht ist. Der Jquery-API-Aufruf funktioniert wie in Versuch 1 bestätigt. So tätige ich die Aufrufe
var apiUrl = "http://andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication";
//alert(username + "|" + password + "|" + apiUrl);
$.ajax({
url: apiUrl,
type: "POST",
data: {
username: username,
password: password
},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
var authenticatedUser = JSON.parse(response);
//alert("Data Loaded: " + authenticatedUser);
if (onComplete != null) {
onComplete(authenticatedUser);
}
},
error: function (xhr, status, error) {
//alert(xhr.responseText);
if (onComplete != null) {
onComplete(xhr.responseText);
}
}
});
Was ich versucht habe
Versuch 1 - Der "richtige" Weg
https://docs.microsoft.com/en-us/aspnet/core/security/cors
Ich habe dieses Tutorial auf der Microsoft-Website bis zu einem T befolgt und alle drei Optionen ausprobiert, um es global in Startup.cs zu aktivieren, es auf jedem Controller einzurichten und es bei jeder Aktion zu versuchen.
Nach dieser Methode funktioniert die domänenübergreifende Funktion, jedoch nur für eine einzelne Aktion auf einem einzelnen Controller (POST an den AccountController). Für alles andere Microsoft.AspNetCore.Cors
weigert sich die Middleware, die Header zu setzen.
Ich habe Microsoft.AspNetCore.Cors
über NUGET installiert und die Version ist1.1.2
Hier ist, wie ich es in Startup.cs eingerichtet habe
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add Cors
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// Add framework services.
services.AddMvc();
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy"));
});
...
...
...
}
// This method gets called by the runtime. Use this method to configure
//the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
// Enable Cors
app.UseCors("MyPolicy");
//app.UseMvcWithDefaultRoute();
app.UseMvc();
...
...
...
}
Wie Sie sehen können, mache ich alles wie gesagt. Ich füge beide Male Cors vor MVC hinzu, und als das nicht funktionierte, versuchte ich, [EnableCors("MyPolicy")]
jeden Controller so einzuschalten
[Route("api/[controller]")]
[EnableCors("MyPolicy")]
public class AdminController : Controller
Versuch 2 - Brute Forcing it
https://andrewlock.net/adding-default-security-headers-in-asp-net-core/
Nachdem ich den vorherigen Versuch mehrere Stunden lang ausprobiert hatte, dachte ich, ich würde versuchen, ihn zu erzwingen, indem ich versuchte, die Header manuell festzulegen, sodass sie bei jeder Antwort ausgeführt werden mussten. Ich habe dies nach diesem Tutorial getan, wie man jeder Antwort manuell Header hinzufügt.
Dies sind die Header, die ich hinzugefügt habe
.AddCustomHeader("Access-Control-Allow-Origin", "*")
.AddCustomHeader("Access-Control-Allow-Methods", "*")
.AddCustomHeader("Access-Control-Allow-Headers", "*")
.AddCustomHeader("Access-Control-Max-Age", "86400")
Dies sind andere Header, die ich ausprobiert habe und die fehlgeschlagen sind
.AddCustomHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "content-type, accept, X-PINGOTHER")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Host, User-Agent, Accept, Accept: application/json, application/json, Accept-Language, Accept-Encoding, Access-Control-Request-Method, Access-Control-Request-Headers, Origin, Connection, Content-Type, Content-Type: application/json, Authorization, Connection, Origin, Referer")
Bei dieser Methode werden die Cross Site-Header ordnungsgemäß angewendet und in meiner Entwicklerkonsole und in Postman angezeigt. Das Problem ist jedoch, dass Access-Control-Allow-Origin
der Webbrowser , während er die Prüfung besteht, einen zischenden Anfall auf (glaube ich) Access-Control-Allow-Headers
Aussage macht415 (Unsupported Media Type)
Die Brute-Force-Methode funktioniert also auch nicht
Schließlich
Hat jemand dies zum Laufen gebracht und könnte helfen oder mich einfach in die richtige Richtung weisen?
BEARBEITEN
Damit die API-Aufrufe ausgeführt werden konnten, musste ich JQuery nicht mehr verwenden und zu einem Pure Javascript- XMLHttpRequest
Format wechseln .
Versuch 1
Ich schaffte es das zu bekommen , Microsoft.AspNetCore.Cors
um die Arbeit von MindingData Antwort folgen, es sei denn innerhalb der Configure
Methode der Umsetzung app.UseCors
vor app.UseMvc
.
Darüber hinaus begann das Mischen mit der Javascript-API-Lösung options.AllowAnyOrigin()
für die Platzhalterunterstützung ebenfalls zu funktionieren.
Versuch 2
Ich habe es also geschafft, Versuch 2 (Brute Forcing It) zum Laufen zu bringen ... mit der einzigen Ausnahme, dass der Platzhalter für Access-Control-Allow-Origin
nicht funktioniert, und als solche muss ich die Domänen, die Zugriff darauf haben, manuell festlegen.
Es ist offensichtlich nicht ideal, da ich nur möchte, dass dieses WebAPI für alle zugänglich ist, aber es funktioniert zumindest für mich auf einer separaten Site, was bedeutet, dass es ein Anfang ist
app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
.AddDefaultSecurePolicy()
.AddCustomHeader("Access-Control-Allow-Origin", "http://localhost:3000")
.AddCustomHeader("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Content-Type, Authorization"));
quelle
415 (Unsupported Media Type)
Setzen Sie für Ihr Problem einenContent-Type
Anforderungsheader aufapplication/json
.Antworten:
Da Sie eine sehr einfache CORS-Richtlinie haben (Alle Anforderungen von der XXX-Domäne zulassen), müssen Sie diese nicht so kompliziert gestalten. Versuchen Sie zunächst Folgendes (Eine sehr grundlegende Implementierung von CORS).
Wenn Sie dies noch nicht getan haben, installieren Sie das CORS-Nuget-Paket.
Fügen Sie in der ConfigureServices-Methode Ihrer startup.cs die CORS-Services hinzu.
Fügen Sie dann in Ihrer Configure-Methode Ihrer startup.cs Folgendes hinzu:
Jetzt probieren Sie es aus. Richtlinien gelten für den Fall, dass Sie unterschiedliche Richtlinien für unterschiedliche Aktionen wünschen (z. B. unterschiedliche Hosts oder unterschiedliche Header). Für Ihr einfaches Beispiel brauchen Sie es wirklich nicht. Beginnen Sie mit diesem einfachen Beispiel und optimieren Sie es von dort aus nach Bedarf.
Lesen Sie weiter: http://dotnetcoretutorials.com/2017/01/03/enabling-cors-asp-net-core/
quelle
app.UseCors
NACH `` app.UseMvc () ` registrieren . Middlewares werden in der Reihenfolge ausgeführt, in der sie registriert sindoptions.DisableHttpsRequirement();
, damit dies funktioniert. Es scheint, dass mit https cors Einstellungen nicht zutrafen.services.AddCors();
BEFORE services.AddMvc () hinzu.Fügen Sie UseCors in Configure hinzu
Hauptpunkt ist das Hinzufügen
app.UseCors
vorapp.UseMvc()
.Stellen Sie sicher, dass Sie die CORS-Funktionalität vor MVC deklarieren, damit die Middleware ausgelöst wird, bevor die MVC-Pipeline die Kontrolle erhält und die Anforderung beendet.
Nachdem die oben beschriebene Methode funktioniert hat, können Sie sie ändern, indem Sie einen bestimmten ORIGIN konfigurieren, um API-Aufrufe zu akzeptieren und zu vermeiden, dass Ihre API für jedermann offen bleibt
Weisen Sie CORS in der Konfigurationsmethode an, die gerade erstellte Richtlinie zu verwenden:
Ich habe gerade diesen kompakten Artikel zu diesem Thema gefunden - https://dzone.com/articles/cors-in-net-core-net-core-security-part-vi
quelle
Configure()
der Reihenfolge ist nicht wirklich wichtig , hier inConfigureServices()
Ich habe meine eigene Middleware-Klasse erstellt, die für mich funktioniert hat. Ich denke, mit der .net-Core-Middleware-Klasse stimmt etwas nicht
und verwendet es auf diese Weise in der startup.cs
quelle
if (!context.Request.Headers.ContainsKey(CorsConstants.Origin)) return this._next(context);
In meinem Fall
get
funktioniert nur die Anfrage gemäß der Antwort von MindingData. Für andere Arten von Anfragen müssen Sie schreiben:Vergiss nicht hinzuzufügen
.AllowAnyHeader()
quelle
Um auf erweitern user8266077 ‚s Antwort , fand ich , dass ich brauchte noch Versorgung OPTIONS Antwort für Preflight - Anfragen in .NET Core - 2.1-Vorschau für meinen Anwendungsfall:
und dann die Middleware wie folgt in Startup.cs aktiviert
quelle
app.Use<CorsMiddleware>();
await _next(context)
und den Statuscode und die Antwort manuell festgelegt habe, wenn dies passiert. Ich musste auch "Autorisierung" zu Access-Control-Allow-Headern hinzufügen, damit die Preflight-Anforderung funktioniert, wenn Anforderungen von React gestellt werden, für die eine Autorisierung erforderlich ist.quelle
Ich hatte seit Tagen damit zu kämpfen.
Ich habe es endlich an die Arbeit , indem
app.UseCors(CORS_POLICY);
zum TOP vonConfigure()
.Ebenfalls:
Microsoft.AspNetCore.Cors
war früher ein erforderliches NuGet-Paket in .Net Core 2 und niedriger; Es ist jetzt automatisch Teil von Microsoft.AspNetCore in .Net Core 3 und höher.builder.AllowAnyOrigin()
und.AllowCredentials()
CORS-Optionen schließen sich jetzt in .Net Core 3 und höher gegenseitig aushttps
. Eine http-URL schien unabhängig von der CORS-Konfiguration des .Net Core-Servers einen CORS-Fehler zu verursachen.http://localhost:52774/api/Contacts
Würde zum Beispiel einen CORS-Fehler geben; Ändern Sie einfach die URL aufhttps://localhost:44333/api/Contacts
funktioniert.Zusätzlicher Hinweis :
quelle
Keines der oben genannten Verfahren hat geholfen und ich habe dann einen Artikel gelesen, der das Problem gelöst hat.
Unten ist der Code.
und
und ganz oben auf meiner Aktionsmethode
quelle
app.UseCors()
) nicht[EnableCors()]
in derselben Anwendung mischen . Sie sollten das eine oder das andere verwenden - aber nicht beide: docs.microsoft.com/en-us/aspnet/core/security/… :Use the [EnableCors] attribute or middleware, not both in the same app.
Versuchen Sie,
jQuery.support.cors = true;
vor dem Ajax-Aufruf hinzuzufügenEs kann auch sein, dass die Daten, die Sie an die API senden, wackelig sind.
Versuchen Sie, die folgende JSON-Funktion hinzuzufügen
dann in Ihren Daten: Objekt ändern Sie es in
quelle
Einfachste Lösung ist hinzufügen
zu Startup.cs.
quelle
Ich denke, wenn Sie Ihre eigene CORS- Middleware verwenden, müssen Sie sicherstellen, dass es sich wirklich um eine CORS- Anforderung handelt, indem Sie den Ursprungsheader überprüfen .
quelle
Access-Control-Allow-Origin
Header nicht vom Server ausgegeben wurde. Eigentlich habe ich Anfragen per Postbote ohneOrigin
Header gesendet . Das hat mir den Tag gerettet! (Oder zumindest mein Vormittag;))Basierend auf Ihrem Kommentar in der Antwort von MindingData hat dies nichts mit Ihrem CORS zu tun. Es funktioniert einwandfrei.
Ihre Controller-Aktion gibt die falschen Daten zurück. HttpCode 415 bedeutet "Nicht unterstützter Medientyp". Dies geschieht, wenn Sie entweder das falsche Format an den Controller übergeben (dh XML an einen Controller, der nur JSON akzeptiert) oder wenn Sie einen falschen Typ zurückgeben (XML in einem Controller zurückgeben, der nur XML zurückgibt).
Für später überprüfen Sie das Vorhandensein eines
[Produces("...")]
Attributs in Ihrer Aktionquelle
Für mich hatte das nichts mit dem Code zu tun, den ich verwendete. Für Azure mussten wir in die Einstellungen des App Service gehen, im Seitenmenü den Eintrag "CORS". Dort musste ich die Domain hinzufügen, von der ich Sachen angefordert hatte. Sobald ich das hatte, war alles magisch.
quelle
Setzen Sie in launchSettings.json unter iisSettings die anonyme Authentifizierung auf true:
Fügen Sie dann in Startup.cs unter ConfigureServices vor services.AddMvc Folgendes hinzu:
und dann in der Methode configure vor app.UseMvc () Folgendes hinzufügen:
quelle
Ich verwende .Net CORE 3.1 und habe lange Zeit damit verbracht, meinen Kopf gegen eine Wand zu schlagen, als mir klar wurde, dass mein Code tatsächlich funktioniert, meine Debugging-Umgebung jedoch fehlerhaft war. Hier sind also zwei Hinweise, wenn Sie versuchen, das Problem zu beheben Problem:
Wenn Sie versuchen, Antwortheader mit ASP.NET-Middleware zu protokollieren, wird der Header "Access-Control-Allow-Origin" niemals angezeigt, selbst wenn er vorhanden ist. Ich weiß nicht wie, aber es scheint außerhalb der Pipeline hinzugefügt zu werden (am Ende musste ich Wireshark verwenden, um es zu sehen).
.NET CORE sendet in der Antwort nicht "Access-Control-Allow-Origin", es sei denn, Ihre Anfrage enthält einen "Origin" -Header. Postman stellt dies nicht automatisch ein, daher müssen Sie es selbst hinzufügen.
quelle
.NET Core 3.1
Arbeitete für mich und wie die Dokumente sagen, um es zu tun:
in der Startup-Klasse:
In der ConfigureServices () -Methode:
In der Configure () -Methode:
https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1
quelle
In meinem Fall habe ich vor dem UserRouting mit UseCors behoben.
quelle
Ich habe die Antwort von MindingData oben zum Laufen gebracht, musste aber Microsoft.AspNet.Cors anstelle von Microsoft.AspNetCore.Cors verwenden. Ich verwende das .NetCore-Webanwendungs-API-Projekt in Visual Studio 2019
quelle
Das
Mit dieser Funktion können Sie CORS mit integrierten Funktionen ausführen, OPTIONS-Anforderungen werden jedoch nicht verarbeitet. Die bisher beste Problemumgehung ist das Erstellen einer neuen Middleware, wie in einem vorherigen Beitrag vorgeschlagen. Überprüfen Sie die Antwort, die im folgenden Beitrag als richtig markiert ist:
Aktivieren Sie den OPTIONS-Header für CORS in der .NET Core-Web-API
quelle
Einfache und einfache Möglichkeit, dies zu tun.
Install-Package Microsoft.AspNetCore.Cors
app.UseCors(options => options.AllowAnyOrigin());
quelle
Hier ist mein Code :)
quelle
Hier ist, wie ich das gemacht habe.
Ich sehe, dass in einigen Antworten sie setzen
app.UserCors("xxxPloicy")
und setzen[EnableCors("xxxPloicy")]
in Controllern. Sie müssen nicht beides tun.Hier sind die Schritte.
Fügen Sie in Startup.cs in den ConfigureServices den folgenden Code hinzu.
Wenn Sie das gesamte Projekt anwenden möchten, fügen Sie den folgenden Code unter Configure method in Startup.cs hinzu
Oder
Wenn Sie es den spezifischen Controllern hinzufügen möchten, fügen Sie den Aktivierungscode wie unten gezeigt hinzu.
Weitere Informationen finden Sie hier
quelle
Verwenden Sie ein benutzerdefiniertes Aktions- / Controller-Attribut, um die CORS-Header festzulegen.
Beispiel:
Dann auf dem Web API Controller / Aktion:
quelle
Nur um hier eine Antwort hinzuzufügen, wenn Sie verwenden
app.UseHttpsRedirection()
und keinen SSL-Port erreichen, sollten Sie dies auskommentieren.quelle
Ich habe Blazor Webassembly als Client und Asp.net Web API Core als Backend verwendet und hatte auch Cors Probleme.
Ich habe mit diesem Code eine Lösung gefunden:
Die ersten Zeilen meiner ASP.Net-Kern-Web-API Startup.cs ConfigureServices und Configure-Methoden sehen folgendermaßen aus:
und meine Configure-Methode:
Ändern Sie
http://example.com
mit Ihrer Client-Domain oder IP-Adressequelle
quelle