Sự cố với chính sách CORS và .NET Core 3.1


12

Tôi không chắc mình đang thiếu gì, nhưng dường như không thể khiến Chính sách CORS của tôi hoạt động với .NET Core 3.1 và phía máy khách 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();
            });
        }

Thông báo lỗi Phía máy khách:

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.

CẬP NHẬT:

Mặc dù tôi đã cấu hình CORS không chính xác (và câu trả lời được chấp nhận dưới đây thực tế đã giúp với điều đó) nhưng gốc rễ của vấn đề không liên quan. Đối với ngữ cảnh bổ sung, ứng dụng đã hoạt động hoàn toàn tốt khi chạy ứng dụng API và Angular bằng CLI - Tôi chỉ gặp vấn đề này sau khi triển khai cả hai lên máy chủ web.

Vấn đề "thực tế" cuối cùng có liên quan đến kết nối SQL, mà tôi chỉ phát hiện ra sau khi thêm ghi nhật ký lỗi tệp phẳng vào API và chạy theo dõi SQL Server để thấy rằng ứng dụng hoàn toàn không thể kết nối với SQL.

Tôi thường mong đợi điều này sẽ trả về 500 và tôi sẽ nhận ra vấn đề trong vòng 10 giây - tuy nhiên cấu hình sai của CORS có nghĩa là 500 không bao giờ thực sự được trả về vì phần mềm trung gian CORS thất bại trước tiên. Điều này là vô cùng bực bội để nói rằng ít nhất là tuyệt đối! . Tuy nhiên tôi muốn nói thêm rằng ở đây trong trường hợp những người khác thấy mình trong tình huống này, vì tôi đã "đuổi nhầm con thỏ", nếu bạn muốn. Sau khi sửa cấu hình CORS, tôi nhận ra vấn đề thực tế hoàn toàn không liên quan đến CORS.

TL; DR; - Đôi khi các lỗi phía máy chủ "Không phải CORS" có thể được trả về là lỗi CORS nếu chính sách CORS không được đặt chính xác

Người giới thiệu:

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


1
cố gắng đặt app.UseCors("foo");trướcapp.UseHttpsRedirection();
StepUp 13/12/19

@StepUp cảm ơn bạn đã giới thiệu, nhưng vẫn không gặp may
KMJungersen

Bạn đã giải quyết vấn đề của bạn?
StepUp

Có ai đã giải quyết vấn đề này chưa? Tại sao không có câu trả lời được chấp nhận?
Waseem Ahmad Naeem

Vâng, xin lỗi tôi không bao giờ quay trở lại vấn đề này sau khi giải quyết nó. Tôi đã thêm một bản cập nhật cho câu hỏi với một số bối cảnh bổ sung. Cảm ơn bạn!
KMJungersen

Câu trả lời:


21

đầu tiên app.UseRouting();sau đóapp.UseCors("foo");

Thay đổi Configurephương pháp của bạn như sau:

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();
    });
}

Nó làm việc cho tôi!


-Có gói nuget cần thiết không?
chana

gói nuget cho cors
chana

1
@chana - bạn không cần cài đặt gói
nuget

7
Tôi đã bị mắc kẹt về vấn đề này trong NGÀY! không có gì từ internet làm việc Giải pháp của bạn kết hợp với ConfigureServicesmã của OP đã giải quyết vấn đề của tôi. Cảm ơn rất nhiều!
Tahreem Iqbal

1
Có phải tôi đã bối rối từ lâu. Cảm ơn nhiều!
Myles J

6

API web đang sử dụng app.UseHttpsRedirection(); mà gây ra CORSvấn đề nếu yêu cầu khách hàng không httpsdựa. Vì vậy, để sử dụng nó với httpmáy khách, chúng tôi cần bình luận hoặc xóa dòng đó.

Vấn đề này không phải với CORS, https đang gây ra sự cố này nhưng lỗi ném là nói với CORS.


Người đàn ông Thanx. Điều này đã giải quyết vấn đề của tôi
Reagan Gallant

1
Đúng rồi! dòng UseHttpsRedirection () phải nằm sau UseCors ()
Eric


0

Khi bạn đang sử dụng localhost như http://localhost:4200, sau đó thử đặt nó trong cấu hình của bạn:

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
     }
}

Configurephương pháp:

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

0

Khi thêm Dịch vụ Cors, đảm bảo bao gồm .SetIsOriginAllowed((host) => true)sau.WithOrigins("http://localhost:4200")

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

0

CHO .NET CORE 3.1

Cách tốt nhất là lưu trữ đường dẫn gốc trong tệp app.sinstall

"Origins": {
    "Server": "http://localhost:5001/",
    "Client": "http://localhost:4200/",
    "CorsOrigins": "http://localhost:4200,http://localhost:5001"
}

và trong ConfigureServicesphương thức xác định nguồn gốc từ phần cấu hình

services.AddCors(
            options => options.AddPolicy(
                PolicyNames.AllowOrigins,
                builder => builder
                    .WithOrigins(
                        Configuration["Origins:CorsOrigins"]
                            .Split(",", StringSplitOptions.RemoveEmptyEntries)
                            .Select(s => s.TrimEnd('/'))
                            .ToArray()
                    )
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials()
            )
        );

Cuối cùng, chỉ cần sử dụng cors trong Configurephương thức (không có vấn đề sử dụng thứ tự!)

app.UseCors(PolicyNames.AllowOrigins);     //Enable CORS!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.