J'essaie d'activer le partage de ressources inter-origines sur mon API Web ASP.NET Core, mais je suis bloqué.
L'attribut EnableCors
accepte policyName
de type string
en tant que paramètre:
// 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);
Que signifie policyName
et comment puis-je configurerCORSsur une API Web ASP.NET Core?
Vous devez configurer une stratégie CORS au démarrage de l'application avec la méthode ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// ...
}
La CorsPolicyBuilder
dans builder
vous permet de configurer la stratégie en fonction de vos besoins. Vous pouvez maintenant utiliser ce nom pour appliquer la stratégie aux contrôleurs et aux actions:
[EnableCors("MyPolicy")]
Ou l'appliquer à chaque demande:
public void Configure(IApplicationBuilder app)
{
app.UseCors("MyPolicy");
// ...
}
Ceci est pour .Net-Core 1.1
Malheureusement, les documents sont très déroutants dans ce cas particulier. Donc, je vais le rendre simple:
Microsoft.AspNetCore.Cors
nuget à votre projetConfigureServices
, ajoutez services.AddCors();
Dans la méthode Configure
, avant d'appeler app.UseMvc()
et app.UseStaticFiles()
, ajoutez:
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
C'est tout. Chaque client a accès à votre API/site Web principal ASP.NET.
Pour .Net-Core 2.0
Microsoft.AspNetCore.Cors
nuget à votre projetdans la méthode ConfigureServices
, avant d'appeler services.AddMvc()
, ajoutez:
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
Dans la méthode Configure
, avant d'appeler app.UseMvc()
, ajoutez app.UseCors("AllowAll");
AllowAll
est le nom de la stratégie que nous devons mentionner dans app.UserCors. Ce pourrait être n'importe quel nom.
Sur la base de Réponse de Henk J'ai pu définir le domaine spécifique, la méthode que je souhaite autoriser ainsi que l'en-tête que je souhaite activer pour CORS:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
.WithMethods("GET")
.WithHeaders("name")));
services.AddMvc();
}
usage:
[EnableCors("AllowSpecific")]
Vous devez configurer dans la classe Startup.cs `
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});`
Spécifiquement dans dotnet core 2.2 avec SignalR vous devez changer
.WithOrigins("http://localhost:3000")
ou
.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins
à la place de .AllowAnyOrigin()
avec .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"));
});
}
`
Si vous hébergez sur IIS, l'une des raisons possibles est que vous obtenez cela parce que IIS bloque le verbe OPTIONS
. J'ai passé presque une heure à cause de cela:
Une indication révélatrice est que vous obtenez une erreur 404
lors de la demande OPTIONS
.
Pour résoudre ce problème, vous devez explicitement indiquer à IIS not de bloquer la demande OPTIONS
.
Aller au filtrage des demandes:
Assurez-vous que les options sont autorisées:
Ou, créez simplement un web.config
avec le paramètre suivant:
<system.webServer>
<security>
<requestFiltering>
<verbs>
<remove verb="OPTIONS" />
<add verb="OPTIONS" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>