【问题标题】:Trouble with CORS Policy and .NET Core 3.1CORS 策略和 .NET Core 3.1 的问题
【发布时间】:2020-04-06 14:58:52
【问题描述】:

我不确定我缺少什么,但似乎无法让我的 CORS 策略与 .NET Core 3.1 和 Angular 8 客户端一起使用。

Startup.cs:

        public void ConfigureServices(IServiceCollection services)
        {
            // ...

            // Add CORS policy
            services.AddCors(options =>
            {
                options.AddPolicy("foo",
                builder =>
                {
                    // Not a permanent solution, but just trying to isolate the problem
                    builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
                });
            });

            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            // Use the CORS policy
            app.UseCors("foo");

            app.UseRouting();

            app.UseAuthorization();

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

错误信息客户端:

Access to XMLHttpRequest at 'https://localhost:8082/api/auth/' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

更新:

虽然我 错误地配置了 CORS(并且下面接受的答案实际上对此有所帮助),但问题的根源是不相关的。对于其他上下文,当使用 CLI 运行 API 和 Angular 应用程序时,该应用程序运行良好 - 我只是在将它们都部署到 Web 服务器后才遇到这个问题。

“实际” 问题最终与 SQL 连接有关,我只是在将平面文件错误日志记录添加到 API 并运行 SQL Server 跟踪以发现该应用程序是'根本无法连接到 SQL。

我通常希望这只会返回 500,并且我会在 10 秒内意识到问题 - 但是 CORS 错误配置意味着实际上从未返回 500,因为 CORS 中间件首先失败。 至少可以说,这非常令人沮丧!。但是,我想在这里补充一点,以防其他人发现自己处于这种情况,因为我是在“追错兔子”,如果你愿意的话。 修复 CORS 配置后,我意识到实际问题与 CORS 完全无关。

TL;DR; - 如果 CORS 策略设置不正确,有时“非 CORS”.NET 服务器端错误可能会作为 CORS 错误返回

参考资料:

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#cors-with-named-policy-and-middleware

https://medium.com/swlh/cors-headers-with-dot-net-core-3-5c9dfc664785

【问题讨论】:

  • 尝试在app.UseHttpsRedirection();之前设置app.UseCors("foo");
  • @StepUp 感谢您的推荐,但仍然没有运气
  • 你的问题解决了吗?
  • 有人解决了这个问题吗?为什么不接受答案?
  • 我的 CORS 已为 .net core 3.1 正确设置,但我遇到了 CORS 错误。与 OP 发现的类似,实际上我试图注入控制器的服务存在问题,天知道为什么会抛出 CORS 错误而不是有意义的错误

标签: angular .net-core cors


【解决方案1】:

在 net core 中使用 CORS 时要确保的事项

  1. 在Configure下确保添加在app.UseRouting();之后

  2. 在 ConfigureServices 中,确切的位置并不重要。

  3. 如果你不使用 https 那么它也不会工作,它会抱怨有 CORS 问题。我按以下顺序添加了它,它工作正常。

      app.UseRouting();
    
      app.UseCors("policy");
    
      app.UseHttpsRedirection();
    
      app.UseAuthorization();
    

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我刚刚发现自定义中间件必须在 useCors() 之后使用

            app.UseHttpsRedirection();
    
            app.UseAuthentication();
    
            app.UsePathBase("/api");
    
            app.UseRouting();
    
            app.UseCors("AllowSpecificOrigins");
    
            app.UseMiddleware<CountryMiddleware>();
    
            app.UseAuthorization();
    
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
    

    【讨论】:

      【解决方案3】:

      我遇到了这个错误,我曾经使用 CLI .net 核心运行我的项目,但它没有工作,但是当我使用 IIS Express Visual Studio 运行项目时,它没有出现 CORS 问题,重定向到 https 时会发生这种情况Startup.css 类 app.UseHttpsRedirection(); 的 Configure 方法中的中间件,就像 Waseem Ahmad Naeem 提到的那样。

      总是访问 .Net Core 中间件顺序是件好事,将它们置于不良顺序可能会给应用程序带来性能问题,甚至使事情无法按预期工作。 中间件文档如下。

      https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0

      【讨论】:

        【解决方案4】:

        可能有几个问题会导致 CORS 错误。确保首先正确配置 CORS。您可以通过以下方式进行配置:

                services.AddCors(options =>
                {
                    options.AddPolicy("CorsPolicy",
                        builder => builder.AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowAnyHeader());
                });
        

        那么在Startup.cs文件的Configure()中,中间件的顺序应该如下:

            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
        
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
        
        
                // Enable middleware to serve generated Swagger as a JSON endpoint.
                app.UseSwagger();
        
                // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
                // specifying the Swagger JSON endpoint.
                app.UseSwaggerUI(c =>
                {
                    c.SwaggerEndpoint("../swagger/v1/swagger.json", "API");
                });
        
                app.UseHttpsRedirection();
        
                app.UseRouting();
        
                app.UseCors("CorsPolicy");
        
                app.UseAuthentication();
        
                app.UseAuthorization();
        
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
            }
        

        如果您已将 .NET 核心应用程序配置为在 HTTPs URL 上运行,那么请确保调用应用程序的 https URL 以获取来自 Angular 的 API 请求。

        如果您从 Angular 调用 HTTP URL 并在 HTTPS 上运行 .NET 核心应用程序,则删除 app.UseHttpsRedirection() 中间件。

        要使用app.UseHttpsRedirection(),要么在 HTTPs URL 上运行 .NET core 并从 angular 发出 HTTPs 请求,要么在 HTTP URL 上运行 .NET core 并从 angular 发出 HTTP 请求(在这种情况下,.NET 应用程序必须只在 HTTP 上运行。不应将其配置为同时在 HTTP 和 HTTPs 上运行)。

        以上几点很可能会解决您的问题。

        【讨论】:

          【解决方案5】:

          在我的情况下,它与标头的 Content-Type 是 application/json 有关。

          只有那些 Content-Type 标头才允许使用 CORS:

          应用程序/x-www-form-urlencoded

          多部分/表单数据

          文本/纯文本

          【讨论】:

            【解决方案6】:

            对 UseCors 的调用必须放在 UseRouting 之后,但在 UseAuthorization 之前。欲了解更多信息,请参阅https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1

            【讨论】:

              【解决方案7】:

              我通过将 EnableCors 添加到我的控制器解决了我的问题

              [EnableCors("MyPolicy")]
              [Route("api/[controller]")]
              [ApiController]
              public class ValuesController : ControllerBase
              

              【讨论】:

                【解决方案8】:

                Web API 正在使用app.UseHttpsRedirection();如果请求客户端不是基于https,则会导致CORS 问题。因此,为了将它与http 客户端一起使用,我们需要注释或删除该行。

                CORS 不存在此问题,https 导致了此问题,但抛出的错误是与 CORS 相关。

                【讨论】:

                • 没错! UseHttpsRedirection() 行必须在 UseCors() 之后
                • 删除它会有所帮助。但是替换 UseHttpsRedirection() 对我不起作用。我把它放在 UseCors 之后。并且 UseCors 被放置在 userouting 之后和 UseHttpsRedirection 之前。
                【解决方案9】:

                添加 Cors 服务时,请确保在 .WithOrigins("http://localhost:4200") 之后包含 .SetIsOriginAllowed((host) =&gt; true)

                services.AddCors(options => {
                            options.AddPolicy("mypolicy",builder => builder
                            .WithOrigins("http://localhost:4200/")
                            .SetIsOriginAllowed((host) => true)
                            .AllowAnyMethod()
                            .AllowAnyHeader());
                  });
                

                【讨论】:

                • 对我有用(没有备用支架),但我希望我知道原因。
                • 这个实现并不完全安全。理想情况下,.WithOrigins.SetOriginIsOriginAllowed 周围的调用应该更像:.WithOrigins("http://localhost:4200") //note the lack of end /.SetIsOriginAllowed((host)=&gt;"http://localhost:4200".Equals(host,StringComparison.InvariantCultureIgnoreCase)),以确保您仅在指定适当的域时才响应
                【解决方案10】:

                由于您使用 localhost 作为http://localhost:4200,然后尝试在您的配置中设置它:

                public void ConfigureServices(IServiceCollection services)
                {
                    services.AddCors(options => options.AddPolicy("ApiCorsPolicy", build =>
                    {                
                        build.WithOrigins("http://localhost:4200")
                             .AllowAnyMethod()
                             .AllowAnyHeader();
                        }));
                        // ... other code is omitted for the brevity
                     }
                }
                

                还有Configure方法:

                public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider provider)
                {
                    if (env.IsDevelopment())
                    {
                        app.UseDeveloperExceptionPage();
                    }
                    app.UseCors("ApiCorsPolicy");
                    app.UseHttpsRedirection();
                    app.UseAuthentication();
                    app.UseMvc();
                }
                

                【讨论】:

                  【解决方案11】:

                  首先是app.UseRouting();,然后是app.UseCors("foo");

                  更改您的 Configure 方法,如下所示:

                  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
                  {
                      if (env.IsDevelopment())
                      {
                          app.UseDeveloperExceptionPage();
                      }
                  
                      app.UseHttpsRedirection();
                  
                  
                  
                      app.UseRouting();  // first
                      // Use the CORS policy
                      app.UseCors("foo"); // second
                  
                      app.UseAuthorization();
                  
                      app.UseEndpoints(endpoints =>
                      {
                          endpoints.MapControllers();
                      });
                  }
                  

                  它对我有用!

                  【讨论】:

                  • -是否需要 nuget 包?
                  • @chana - 你不需要安装 nuget 包
                  • 我被这个问题困扰了好几天!互联网上没有任何效果。您的解决方案结合 OP 的 ConfigureServices 代码解决了我的问题。非常感谢!
                  • 它是否记录在任何地方?
                  • 在这个问题上绕来绕去,请注意版本号,尤其是在处理安全包时,如果有人搜索过 web API CORS 并且像我一样丢失了很多结果,安装包Microsoft.WebApi.Cors Owin.Cors 就像 .Net Core 3 中绝对不需要的其他答案一样,它已经捆绑了,在我遇到这个让我惊讶的答案之前,从来没有预料到的顺序很重要。非常感谢这个答案,这个修复可能会永远消失..
                  【解决方案12】:

                  试试这个工具

                  https://www.nuget.org/packages/Microsoft.AspNetCore.Cors/ 使用它,您可以启用/禁用 .net 核心应用程序中的 cors

                  【讨论】:

                    猜你喜欢
                    • 2020-05-22
                    • 2020-07-30
                    • 2021-02-14
                    • 2020-11-02
                    • 1970-01-01
                    • 2017-10-14
                    • 2020-09-10
                    • 2020-07-16
                    • 2021-12-06
                    相关资源
                    最近更新 更多