Cách bật CORS trong ASP.NET Core


188

Tôi đang cố gắng kích hoạt chia sẻ tài nguyên nguồn gốc chéo trên API Web ASP.NET của tôi, nhưng tôi bị kẹt.

Các EnableCorsthuộc tính chấp nhận policyNamekiểu stringnhư tham số:

// 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);

Nghĩa là gì policyNamevà làm cách nào tôi có thể định cấu hình CORS trên API Web ASP.NET?


Câu trả lời:


325

Bạn phải định cấu hình chính sách CORS khi khởi động ứng dụng theo ConfigureServicesphương thức:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    }));

    // ...
}

Các CorsPolicyBuildertrong buildercho phép bạn cấu hình các chính sách yêu cầu của bạn. Bây giờ bạn có thể sử dụng tên này để áp dụng chính sách cho bộ điều khiển và hành động:

[EnableCors("MyPolicy")]

Hoặc áp dụng nó cho mọi yêu cầu:

public void Configure(IApplicationBuilder app)
{
    app.UseCors("MyPolicy");

    // ...

    // This should always be called last to ensure that
    // middleware is registered in the correct order.
    app.UseMvc();
}

12
Tôi thấy rằng app.UseCors ("MyPolicy") không hoạt động cho các điểm cuối API của tôi. Tôi cần phải rõ ràng [EnableCors ("MyPolicy")] trên các điểm cuối của bộ điều khiển được đề cập.
robbpriestley

9
Từ các tài liệu chính thức : "Để kích hoạt CORS cho toàn bộ ứng dụng của bạn, hãy thêm phần mềm trung gian CORS vào đường dẫn yêu cầu của bạn bằng UseCorsphương thức mở rộng. Lưu ý rằng phần mềm trung gian CORS phải đi trước mọi điểm cuối được xác định trong ứng dụng của bạn mà bạn muốn hỗ trợ các yêu cầu xuất xứ chéo (ví dụ . trước khi có bất kỳ cuộc gọi nào UseMvc). "
Alex Klaus

2
Tôi đã thêm app.UseCors () sau app.AddMvc () và nó không hoạt động. Bởi vì thứ tự của các phương thức sử dụng ảnh hưởng đến cách thức hoạt động của phần mềm trung gian!
Obay Abd-Algader

1
Có bất kỳ rủi ro cho phép bất kỳ nguồn gốc?
Percy

Câu trả lời này không phù hợp với tôi, vì thiếu gói nuget Microsoft.AspNetCore.Cors.
Reven

108

Áp dụng cho .NET Core 1 và .Net Core 2 (tiếp tục xuống)

Nếu sử dụng .Net-Core 1.1

Thật không may, các tài liệu rất khó hiểu trong trường hợp cụ thể này. Vì vậy, tôi sẽ làm cho nó đơn giản:

  • Thêm vào Microsoft.AspNetCore.Cors gói nuget vào dự án của bạn
  • Trong ConfigureServicesphương thức, thêmservices.AddCors();
  • Trong Configurephương thức, trước khi gọi app.UseMvc()app.UseStaticFiles(), thêm:

    app.UseCors(builder => builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());

Đó là nó. Mọi khách hàng đều có quyền truy cập vào Trang web / API ASP.NET Core của bạn.


Nếu sử dụng .Net-Core 2.0

  • ThêmMicrosoft.AspNetCore.Cors gói nuget vào dự án của bạn
  • trong ConfigureServicesphương thức, trước khi gọi services.AddMvc(), thêm:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (Quan trọng) Trong Configurephương thức, trước khi gọi app.UseMvc(), hãy thêm app.UseCors("AllowAll");

    AllowAlllà tên chính sách mà chúng ta cần đề cập trong app.UserCors. Nó có thể là bất kỳ tên nào.


2
đúng, nghĩ rằng tôi có thể kích hoạt chỉ một trong số họ!
eugeneK

7
Cảm ơn. Tôi đã có AddCors sau UseMvc và điều đó khiến nó không hoạt động chính xác. Của bạn là câu trả lời duy nhất đề cập đến điều này.
JesseNewman19

1
Đây không phải là công việc tôi không nghĩ. Khi cung cấp thông tin đăng nhập, bạn không thể cho phép bất kỳ nguồn gốc. Tôi vẫn đang cố gắng để làm việc này.
Jason Goemaat

7
Đó là phần quan trọng: .UseCors()trước.UseMvc()
Neps

3
Đã lãng phí thời gian mà không biết về UseCors trước UserMvc ... cảm ơn vì sự giúp đỡ!
Thomas

37

Dựa trên câu trả lời của Henk, tôi đã có thể đưa ra tên miền cụ thể, phương pháp tôi muốn cho phép và cả tiêu đề tôi muốn kích hoạt CORS cho:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
         options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
                                                   .WithMethods("GET")
                                                   .WithHeaders("name")));
    services.AddMvc();
}

sử dụng:

[EnableCors("AllowSpecific")]

Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
zrvan

14
To critique or request clarification from an authorTôi không nghĩ đó là trường hợp ở đây và câu trả lời của Henk đã được đánh dấu. Câu trả lời của tôi là một tiện ích bổ sung nếu bạn muốn cho phép các tên miền cụ thể.
Oluwafemi

Một cái gì đó bị thiếu trong mã của bạn, 'IServiceCollection' không chứa định nghĩa cho 'ConfigureCors'. Vui lòng kiểm tra nó và cố gắng đưa ra một câu trả lời đầy đủ.
Sami-L

@ Sami-L Vui lòng kiểm tra câu trả lời cập nhật của tôi. Tôi phát hiện ra rằng ConfigureCorsđã được thay đổi thành AddCors.
Oluwafemi

9

Cụ thể trong lõi dotnet 2.2 với SignalR, bạn phải thay đổi

.WithOrigins("http://localhost:3000") hoặc là

.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins

thay vì .AllowAnyOrigin()với.AllowCredentials()

https://trailheadt Technology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/

https://github.com/aspnet/AspNetCore/issues/4483


Sử dụng SignalR trong ứng dụng bảng điều khiển .NET Core và đây là giải pháp hoạt động duy nhất cho kịch bản của tôi.
asdf

7

Nếu bạn đang lưu trữ trên IIS, một lý do có thể là bạn đang nhận được điều này là do IIS đang chặn OPTIONSđộng từ. Tôi đã dành gần một giờ vì điều này:

Một dấu hiệu nhận biết là bạn đang gặp 404lỗi trong khi OPTIONSyêu cầu.

Để khắc phục điều này, bạn cần thông báo rõ ràng cho IIS không chặn OPTIONSyêu cầu.

Chuyển đến Lọc yêu cầu:

Lọc yêu cầu IIS

Đảm bảo TÙY CHỌN được cho phép:

Đảm bảo TÙY CHỌN là đúng

Hoặc, chỉ cần tạo một web.configvới cài đặt sau:

<system.webServer>
    <security>
        <requestFiltering>
            <verbs>
                <remove verb="OPTIONS" />
                <add verb="OPTIONS" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>

7

Bạn phải cấu hình trong lớp Startup.cs

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

5

`

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

`


Cách tuyệt vời để phá vỡ bảo mật trình duyệt đã được triển khai. Đừng!
JCKödel

2
Tôi không nghĩ rằng điều này nên được bỏ phiếu. Đây là một cách "thay thế". Bạn có thể sử dụng phương thức "UseCors ()" hoặc thêm bộ lọc MVC toàn cầu giống như những gì mà Nathan đã làm ở đây.
Josh Mouch

cái này hoạt động với tôi trên .net core 2.2 cộng với việc thêm app.UseCors ("AllowAnyOrigin"); trong phương pháp "Cấu hình"
Harry Sarshogh

Điều quan trọng là "Thêm gói nuget Microsoft.AspNetCore.Cors vào dự án của bạn". Cảm ơn bạn đã đề cập đến nó!
Mason Zhang

4

Làm việc này với .Net Core 3.1 như sau

1.Hãy chắc chắn rằng bạn đặt mã UseCors giữa app.UseRouting (); và app.UseAuthentication ();

        app.UseHttpsRedirection();

        app.UseRouting();
        app.UseCors("CorsApi");

        app.UseAuthentication();
        app.UseAuthorization();

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

2.Sau đó đặt mã này vào phương thức ConfigureService

services.AddCors(options =>
        {
            options.AddPolicy("CorsApi",
                builder => builder.WithOrigins("http://localhost:4200", "http://mywebsite.com")
            .AllowAnyHeader()
            .AllowAnyMethod());
        });

3.Và bộ điều khiển cơ sở tôi đặt cái này

[EnableCors("CorsApi")]
[Route("api/[controller]")]
[ApiController]
public class BaseController : ControllerBase

Bây giờ tất cả các bộ điều khiển của tôi sẽ kế thừa từ BaseContoder và sẽ kích hoạt CORS


Mọi thứ vẫn hoạt động với tôi cho đến khi tôiplace the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014

1

Bước 1: Chúng tôi cần gói Microsoft.AspNetCore.Cors trong dự án của chúng tôi. Để cài đặt, hãy đi tới Công cụ -> Trình quản lý gói NuGet -> Quản lý gói NuGet cho Giải pháp. Tìm kiếm Microsoft.AspNetCore.Cors và cài đặt gói.

Bước 2: Chúng ta cần tiêm CORS vào thùng chứa để ứng dụng có thể sử dụng. Trong lớp Startup.cs, hãy đến phương thức ConfigureService và đăng ký CORS.

nhập mô tả hình ảnh ở đây

Vì vậy, trong ứng dụng máy chủ của chúng tôi, hãy truy cập Bộ điều khiển -> HomeContoder.cs và thêm trình trang trí EnableCors vào phương thức Index (Hoặc bộ điều khiển và hành động cụ thể của bạn):

nhập mô tả hình ảnh ở đây

Để biết thêm chi tiết Bấm vào đây


0

Tất cả các cách giải quyết được đề cập ở trên có thể hoạt động hoặc có thể không hoạt động, trong hầu hết các trường hợp, nó sẽ không hoạt động. Tôi đã đưa ra giải pháp ở đây

Hiện tại tôi đang làm việc với API góc và Web (.net Core) và đã gặp vấn đề CORS được giải thích bên dưới

Các giải pháp được cung cấp ở trên sẽ luôn luôn làm việc. Với yêu cầu 'TÙY CHỌN', thực sự cần thiết phải bật 'Xác thực ẩn danh'. Với giải pháp được đề cập ở đây, bạn không phải thực hiện tất cả các bước được đề cập ở trên, như cài đặt IIS.

Dù sao ai đó đã đánh dấu bài đăng trên của tôi là trùng lặp với bài đăng này, nhưng tôi có thể thấy rằng bài đăng này chỉ để kích hoạt CORS trong ASP.net Core, nhưng bài đăng của tôi có liên quan đến, Kích hoạt và triển khai CORS trong ASP.net Core và Angular.

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.