.NET Core UseCors()不添加标头

这将是Access-Control-Allow-Origin标头如何工作的重复? ,但那里的方法也不适合我。 我希望我只是缺少一些东西。

我试图从我的.NET Core Web API的响应中获取一个Access-Control-Allow-Origin标头,我通过AJAX访问它。

我尝试过几件事。 除非另有说明,否则所有内容都在Startup.cs文件中。

方法1

根据Microsoft文档 :

 public void ConfigureServices(IServiceCollection services) { // Add database services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DbConnection"))); // Add the ability to use the API with JSON services.AddCors(); // Add framework services. services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); if (env.IsDevelopment()) { using (var serviceScope = app.ApplicationServices.GetRequiredService().CreateScope()) { serviceScope.ServiceProvider.GetService().Database.Migrate(); serviceScope.ServiceProvider.GetService().EnsureSeedData(); } } app.UseCors(builder => builder.WithOrigins("https://localhost:44306").AllowAnyMethod()); app.UseJwtBearerAuthentication(new JwtBearerOptions { Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"], Audience = Configuration["Authentication:AzureAd:Audience"], }); app.UseMvc(); } 

方法2

 public void ConfigureServices(IServiceCollection services) { // ... services.AddCors(options => options.AddPolicy("AllowWebApp", builder => builder.AllowAnyMethod() .AllowAnyMethod() .AllowAnyOrigin())); //.WithOrigins("https://localhost:44306"))); // ... } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { // ... app.UseCors("AllowWebApp"); // ... } 

我也尝试在Controller和Method上添加[EnableCors("AllowWebApp")]

从邮差,我得到:

content-encoding→gzip
content-type→text / plain; 字符集= utf-8的
日期→星期三,2017年1月25日04:51:48 GMT
服务器→红隼
状态→200
变化→接受编码
x-powered-by→ASP.NET
x-sourcefiles→=?UTF-8?B?[删除]

我也在Chrome中尝试过,并获得了类似的标题。

如果重要,我尝试访问的方法上有一个Authorize属性。 但那部分应该工作正常(我至少得到了很好的回应)

那么,我是否遗漏了一些非常明显的东西,或者这是否会被打破? 我目前正在运行1.1.0版。


编辑添加JS和Controller Stub

 function getContactPreviews(resultsCallback) { var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = () => { if (xmlhttp.readyState == XMLHttpRequest.DONE && xmlhttp.status == 200) { resultsCallback(JSON.parse(xmlhttp.response)); } } xmlhttp.open("GET", "https://localhost:44357/api/User/ContactsPreview", true); xmlhttp.setRequestHeader("Authorization", "Bearer " + localStorage.getItem("AuthorizationToken")); xmlhttp.send(); } 

控制器存根

 [Authorize] [Route("api/[controller]")] public class UserController : ApiController { [HttpGet(nameof(ContactsPreview))] [EnableCors("AllowWebApp")] public IEnumerable ContactsPreview() { // ... } } 

问题是,当使用承载认证(或任何我想象的)时,它会添加一个标题“授权”,如果设置允许该标头,服务器将只提供一个好的。

有两种方法可以解决问题,下面是唯一需要的代码。 它位于Web API解决方案的Startup.cs中的Configure()方法中。

方法1:允许所有标头

 app.UseCors(builder => builder.WithOrigins("https://localhost:44306") .AllowAnyMethod() .AllowAnyHeader()); 

方法2:允许特定标头

 app.UseCors(builder => builder.WithOrigins("https://localhost:44306") .AllowAnyMethod() .WithHeaders("authorization", "accept", "content-type", "origin")); 

额外的标题是因为,根据文档:

浏览器在设置Access-Control-Request-Headers方面并不完全一致。 如果将标题设置为“*”以外的任何标题,则应至少包括“accept”,“content-type”和“origin”,以及您要支持的任何自定义标题。

仅在以下情况下返回Access-Control-Allow-Origin标头:

  1. 该请求包括“Origin”标题。
  2. 请求的来源与CORS政策相匹配。

然后,服务器返回带有原始URL作为值的ACAO标头。

Origin标头通常由XMLHttpRequest对象设置。

有关更多信息,请参阅CORS的工作原理

在Startup.cs文件中,添加以下内容

 public CorsPolicy GenerateCorsPolicy(){ var corsBuilder = new CorsPolicyBuilder(); corsBuilder.AllowAnyHeader(); corsBuilder.AllowAnyMethod(); corsBuilder.AllowAnyOrigin(); // For anyone access. //corsBuilder.WithOrigins("http://localhost:56573"); // for a specific url. Don't add a forward slash on the end! corsBuilder.AllowCredentials(); return corsBuilder.Build(); } 

在ConfigureServices方法中:

  services.AddCors(options => { options.AddPolicy("AllowAllOrigins", GenerateCorsPolicy()); }); 

//在整个应用程序中全局应用CORS //在Configure方法中,添加

 app.UseCors("AllowAllOrigins"); 

[DisableCors]
使用DisableCors属性,我们可以为控制器或操作禁用CORS。

//启用CORS控制器 – 如果全局应用,则不需要此。

 [EnableCors("AllowAllOrigins")] public class HomeController: Controller {}