Ich versuche, die gemeinsame Nutzung von Origin-Ressourcen für meine ASP.NET Core-Web-API zu aktivieren, aber ich bin festgefahren.
Das EnableCors
-Attribut akzeptiert policyName
vom Typ string
als Parameter:
// Summary:
// Creates a new instance of the Microsoft.AspNetCore.Cors.Core.EnableCorsAttribute.
//
// Parameters:
// policyName:
// The name of the policy to be applied.
public EnableCorsAttribute(string policyName);
Was bedeutet policyName
und wie kann ichCORSauf einer ASP.NET Core-Web-API konfigurieren?
Sie müssen eine CORS-Richtlinie beim Anwendungsstart in der ConfigureServices
-Methode konfigurieren:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// ...
}
Mit der Variable CorsPolicyBuilder
in builder
können Sie die Richtlinie an Ihre Anforderungen anpassen. Sie können diesen Namen jetzt verwenden, um die Richtlinie auf Controller und Aktionen anzuwenden:
[EnableCors("MyPolicy")]
Oder wenden Sie es auf jede Anfrage an:
public void Configure(IApplicationBuilder app)
{
app.UseCors("MyPolicy");
// ...
}
Dies ist für .Net-Core 1.1
Leider sind die Dokumente in diesem speziellen Fall sehr verwirrend. Also mache ich es ganz einfach:
Microsoft.AspNetCore.Cors
-Nuget-Paket zu Ihrem Projekt hinzuConfigureServices
-Methode services.AddCors();
hinzu.Fügen Sie in der Configure
-Methode vor dem Aufruf von app.UseMvc()
und app.UseStaticFiles()
Folgendes hinzu:
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
Das ist es. Jeder Client hat Zugriff auf Ihre ASP.NET Core-Website/API.
Für .Net-Core 2.0
Microsoft.AspNetCore.Cors
-Nuget-Paket zu Ihrem Projekt hinzufügen Sie in der ConfigureServices
-Methode vor dem Aufruf von services.AddMvc()
Folgendes hinzu:
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
Fügen Sie in der Configure
-Methode vor dem Aufruf von app.UseMvc()
app.UseCors("AllowAll");
hinzu.
AllowAll
ist der Richtlinienname, den wir in app.UserCors angeben müssen. Es könnte ein beliebiger Name sein.
Basierend auf Henks Antwort konnte ich die spezifische Domäne, die Methode, die ich zulassen möchte, und auch den Header, für den ich CORS aktivieren möchte, finden:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
.WithMethods("GET")
.WithHeaders("name")));
services.AddMvc();
}
verwendungszweck:
[EnableCors("AllowSpecific")]
Sie müssen in der Startup.cs-Klasse `konfigurieren
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});`
Speziell in Dotnet Core 2.2 mit SignalR müssen Sie dies ändern
.WithOrigins("http://localhost:3000")
oder
.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins
stattdessen .AllowAnyOrigin()
mit .AllowCredentials()
https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/
`
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowAnyOrigin",
builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
services.Configure<MvcOptions>(options => {
options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin"));
});
}
`
Wenn Sie auf IIS hosten, besteht ein möglicher Grund darin, dass Sie dies erhalten, weil IIS OPTIONS
verb blockiert. Ich verbrachte aus diesem Grund fast eine Stunde:
Ein verräterischer Hinweis ist, dass Sie während der OPTIONS
-Anforderung einen 404
-Fehler erhalten.
Um dies zu beheben, müssen Sie IIS not explizit mitteilen, dass die OPTIONS
-Anforderung blockiert werden soll.
Gehe zur Anforderungsfilterung:
Vergewissere dich, dass OPTIONS erlaubt ist:
Oder erstellen Sie einfach einen web.config
mit der folgenden Einstellung:
<system.webServer>
<security>
<requestFiltering>
<verbs>
<remove verb="OPTIONS" />
<add verb="OPTIONS" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>