根据官方文档,Asp.net Core 3.0 CORS 无法正常工作

Posted

技术标签:

【中文标题】根据官方文档,Asp.net Core 3.0 CORS 无法正常工作【英文标题】:Asp.net Core 3.0 CORS not working based on official documentation 【发布时间】:2020-02-26 02:30:47 【问题描述】:

我想通过 Asp.Net Core 3.0 API 项目启用 CORS。这是生成的基本 Asp.Net Core Api 模板。模板中的所有内容都是默认设置,除了我从文档中添加了 CORS 设置:Enable Cross-Origin Requests (CORS) in ASP.NET Core

这是我的 Startup.cs

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.AddControllers();
            services.AddCors(options =>
            
                options.AddPolicy("CorsPolicy",
                    builder => builder.WithOrigins("localhost", "www.google.com")
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
            );
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseCors("CorsPolicy");
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers();
            );
        
  

这些是我的响应标头:

我应该如何设置才能在响应中获取正确的 CORS 标头?

这是我的 fetch api 测试:

【问题讨论】:

【参考方案1】:

糟糕,我成功解决了这个问题。

这个组合对我来说是唯一的,什么是有效的:

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.AddControllers();
            services.AddCors(); //This needs to let it default
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseCors(
                options => options.SetIsOriginAllowed(x => _ = true).AllowAnyMethod().AllowAnyHeader().AllowCredentials()
            ); //This needs to set everything allowed

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers();
            );
        

【讨论】:

谢谢老哥,遇到了同样的问题! 谢谢,但是origin应该是SetIsOriginAllowed(_ => true)(效果一样,但是dummy assignment没有意义)。【参考方案2】:

如果将 API URL 直接放在浏览器中,则不涉及 CORS。 这不是跨域请求。

只有当您将页面托管在一个来源时才会发生这种情况,例如localhost:5000,它的 javascript 代码调用源 localhost:5001 的 API。 (或以其他方式从其他来源获取资源)

但在您的情况下,唯一的来源是 API 来源,因此不需要 CORS。

【讨论】:

我也使用 fetch api 对其进行了测试,结果相同(没有 cors 标头)。我的原始问题扩展为 fetch api screenshot。 简单请求可能不会触发 CORS 预检。 您的 CORS 配置无法让您的网站访问 Google。你倒过来了。 Google 需要将您的网站 添加到他们的 CORS 配置中,以便您访问。 @Amy 它是从源 www.google.com 到 localhost 的提取。当然,重要的是 OP 的 CORS。如果调用的是 Google API,那么它将是他们的。 @Amy 不,这不是谷歌方面的设置,这是我方面的设置,而且似乎 Asp.Net Core 3.0 CORS 设置不起作用:(

以上是关于根据官方文档,Asp.net Core 3.0 CORS 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS

[译]基于ASP.NET Core 3.0的ABP v0.21已发布

ASP .NET CORE 根据环境变量支持多个 appsettings.json

ASP.NET Core官方文档+源码,这样学效率高10倍!

ASP.NET Core API JWT 身份验证:我在哪里可以找到有关它的官方文档?

由于请求正文过大,大文件上传到 ASP.NET Core 3.0 Web API 失败