我正在尝试在我的ASP.NET Core Web API上启用跨源资源共享,但我陷入困境。
EnableCors
属性接受policyName
类型的string
作为参数:
// 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);
policyName
的含义是什么?如何在ASP.NET Core Web API上配置 CORS ?
答案 0 :(得分:209)
您必须在ConfigureServices
方法的应用程序启动时配置CORS策略:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// ...
}
CorsPolicyBuilder
中的builder
可让您根据需要配置策略。您现在可以使用此名称将策略应用于控制器和操作:
[EnableCors("MyPolicy")]
或将其应用于每个请求:
public void Configure(IApplicationBuilder app)
{
app.UseCors("MyPolicy");
// ...
}
答案 1 :(得分:82)
这适用于.Net-Core 1.1
不幸的是,在这种特定情况下,文档非常混乱。所以我会让它变得简单:
Microsoft.AspNetCore.Cors
nuget包添加到您的项目ConfigureServices
方法中,添加services.AddCors();
在Configure
方法中,在致电app.UseMvc()
和app.UseStaticFiles()
之前,请添加:
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
那就是它。每个客户都可以访问您的ASP.NET核心网站/ API。
.Net-Core 2.0
Microsoft.AspNetCore.Cors
nuget包添加到您的项目ConfigureServices
方法中,在致电services.AddMvc()
之前,请添加:
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
在Configure
方法中,在致电app.UseMvc()
之前,添加app.UseCors("AllowAll");
AllowAll
是我们需要在app.UserCors中提及的策略名称。它可以是任何名称。
答案 2 :(得分:31)
基于Henk's answer我已经能够提出特定的域,我想要允许的方法以及我想要为其启用CORS的头:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
.WithMethods("GET")
.WithHeaders("name")));
services.AddMvc();
}
用法:
[EnableCors("AllowSpecific")]
答案 3 :(得分:18)
按照以下说明使用 .Net Core 3.1 进行此操作
1。确保将UseCors代码放在app.UseRouting()之间;和app.UseAuthentication();
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors("CorsApi");
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints => {
endpoints.MapControllers();
});
2。然后将这段代码放在ConfigureServices方法中
services.AddCors(options =>
{
options.AddPolicy("CorsApi",
builder => builder.WithOrigins("http://localhost:4200", "http://mywebsite.com")
.AllowAnyHeader()
.AllowAnyMethod());
});
3。并且在基本控制器上方放置了
[EnableCors("CorsApi")]
[Route("api/[controller]")]
[ApiController]
public class BaseController : ControllerBase
现在,我所有的控制器都将从BaseController继承并启用CORS
答案 4 :(得分:4)
您必须在Startup.cs类中进行配置
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
答案 5 :(得分:2)
`
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"));
});
}
`
答案 6 :(得分:2)
如果您在IIS上托管,则可能的原因之一是因为IIS阻止了OPTIONS
动词。因此,我花了将近一个小时的时间:
一个明显的迹象是,您在404
请求期间遇到OPTIONS
错误。
要解决此问题,您需要明确告知IIS 不阻止OPTIONS
请求。
转到请求过滤:
确保允许选项:
或者,只需使用以下设置创建一个web.config
:
<system.webServer>
<security>
<requestFiltering>
<verbs>
<remove verb="OPTIONS" />
<add verb="OPTIONS" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
答案 7 :(得分:2)
特别是在带有SignalR的dotnet core 2.2中,您必须更改
.WithOrigins("http://localhost:3000")
或
.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins
用.AllowAnyOrigin()
代替.AllowCredentials()
https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/
答案 8 :(得分:1)
安装 nuget 包 #include <Variants.hpp>
Variant v;
...
if (VarIsStr(v))
{
AnsiString str = v;
// do something
}
在Microsoft.AspNetCore.CORS
方法下的Startup.cs
中,在ConfigureServices
之前添加以下代码
services.AddMVC()
在 services.AddCors(options =>
{
options.AddPolicy("AllowMyOrigin", p =>
{
p.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
方法内的 Startup.cs
中,在调用 Configure
之前添加 app.UseCors("AllowMyOrigin");
请注意,当从客户端发送请求时,请记住使用 https 而不是 http。
答案 9 :(得分:1)
步骤1:我们的项目中需要Microsoft.AspNetCore.Cors软件包。要进行安装,请转到工具-> NuGet软件包管理器->管理解决方案的NuGet软件包。搜索Microsoft.AspNetCore.Cors并安装该软件包。
第2步:我们需要将CORS注入到容器中,以便应用程序可以使用它。在Startup.cs类中,让我们转到ConfigureServices方法并注册CORS。
因此,在我们的服务器应用中,转到控制器-> HomeController.cs,然后将EnableCors装饰器添加到Index方法(或您的特定控制器和操作)中:
有关更多信息,Click Here
答案 10 :(得分:0)
如果出现错误“所请求的资源上没有'Access-Control-Allow-Origin'标头,”。专门针对 PUT 和 DELETE 请求,您可以尝试在IIS上禁用WebDAV。
显然,WebDAVModule默认情况下处于启用状态,并且默认情况下禁用PUT和DELETE请求。
要禁用WebDAVModule,请将其添加到您的web.config:
<system.webServer>
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
</system.webServer>
答案 11 :(得分:0)
您可以通过三种方式启用CORS:
使用命名策略启用CORS:
public class Startup
{
readonly string CorsPolicy = "_corsPolicy";
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(name: CorsPolicy,
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
// services.AddResponseCaching();
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseCors(CorsPolicy);
// app.UseResponseCaching();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
使用 UseResponseCaching 时,必须在 UseResponseCaching 之前调用UseCors 。
使用默认策略启用CORS:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddDefaultPolicy(
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseCors();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
启用具有端点的CORS
public class Startup
{
readonly string CorsPolicy = "_corsPolicy ";
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(name: CorsPolicy,
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseCors();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers()
.RequireCors(CorsPolicy)
});
}
}
启用具有属性的CORS
您有拖曳选项
答案 12 :(得分:0)
一些故障排除技巧,在我设法在最微不足道的 CORS 问题上浪费了两个小时之后:
如果您看到 CORS policy execution failed
已记录...不要认为您的 CORS 策略没有正确执行。事实上,CORS 中间件工作正常,并且您的策略正在正确执行。这条措辞不当的消息唯一意味着请求的来源与任何允许的来源 (see source) 都不匹配,即请求被禁止。
起源检查(从 ASP.NET Core 5.0 开始)以一种非常简单的方式发生……即您通过 {{1 提供的字符串之间区分大小写的序数字符串比较 (see source) }} 以及 WithOrigins()
中存在的内容。
如果您使用尾部斜杠 HttpContext.Request.Headers[Origin]
设置允许的原点,或者它包含大写字母,则 CORS 可能会失败。 (在我的例子中,我确实不小心用斜杠复制了主机。)
答案 13 :(得分:0)
这涵盖了每个端点。如果你想阻止某个端点使用这个注释 [DisableCors]
它在这里描述得很好。 https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-5.0
namespace CompanyApi2
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
options.AddPolicy(name: mypolicy,
builder =>
{
builder.AllowAnyHeader().AllowAnyMethod()
.AllowAnyOrigin();
})); //add this
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddScoped<IDatarepository, DatabaseRepository>();
}
public string mypolicy = "mypolicy";
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors(mypolicy); //add this
app.UseHttpsRedirection();
app.UseMvc();
}
}
}
答案 14 :(得分:0)
最近在 azure web app 上托管 web app 服务器时,不得不编辑 azure app cors 设置来解决这个问题(只有代码没有解决问题)
答案 15 :(得分:0)
在 .Net Core 3.1 中使用如下:
在 ConfigureServices()
方法中:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddCors();
...
}
在 Configure()
方法中:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseCors(builder =>
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
);
...
}
答案 16 :(得分:0)
上面提到的所有解决方法都可能起作用,也可能不起作用,在大多数情况下将不起作用。我在这里给出了解决方案
Currently I am working on Angular and Web API(.net Core) and came across CORS issue explained below
以上提供的解决方案将始终有效。对于“ OPTIONS”请求,确实有必要启用“匿名身份验证”。使用此处提到的解决方案,您无需执行上述所有步骤,例如IIS设置。
无论如何,有人将我的上述帖子标记为与该帖子重复,但是我可以看到,该帖子仅用于在ASP.net Core中启用CORS,但我的帖子与在ASP.net Core中启用和实现CORS和角度的。