วิธีเปิดใช้งาน CORS ใน ASP.NET Core


190

ฉันกำลังพยายามเปิดใช้งานการข้ามแหล่งข้อมูลร่วมกันบน ASP.NET Core Web API ของฉัน แต่ฉันติดขัด

EnableCorsแอตทริบิวต์ยอมรับpolicyNameจากประเภทstringเป็นพารามิเตอร์:

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

อะไรpolicyNameหมายและวิธีการที่ฉันสามารถกำหนดค่าบนหลัก ASP.NET Web API?


1
นี่คือบทความdocs.microsoft.com/en-us/aspnet/core/security/cors
Elaine

คำตอบ:


328

คุณต้องกำหนดค่านโยบาย CORS เมื่อเริ่มต้นแอปพลิเคชันในConfigureServicesวิธีการ:

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

    // ...
}

The CorsPolicyBuilderin builderอนุญาตให้คุณกำหนดค่านโยบายตามความต้องการของคุณ ตอนนี้คุณสามารถใช้ชื่อนี้เพื่อใช้นโยบายกับตัวควบคุมและการกระทำ:

[EnableCors("MyPolicy")]

หรือนำไปใช้กับทุกคำขอ:

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
ฉันพบว่า app.UseCors ("MyPolicy") ไม่ทำงานสำหรับจุดสิ้นสุด API ของฉัน ฉันต้องการ [EnableCors ("MyPolicy")] อย่างชัดเจนในจุดสิ้นสุดของตัวควบคุมที่เป็นปัญหา
robbpriestley

9
จากเอกสารอย่างเป็นทางการ : "ในการเปิดใช้งาน CORS สำหรับแอปพลิเคชันทั้งหมดของคุณให้เพิ่มมิดเดิลแวร์ CORS ไปยังคำขอของคุณโดยใช้UseCorsวิธีการขยายโปรดทราบว่ามิดเดิลแวร์ CORS จะต้องนำหน้าปลายทางที่กำหนดไว้ในแอปของคุณที่คุณต้องการ ก่อนการโทรไปUseMvc)
Alex Klaus

2
ฉันเพิ่ม app.UseCors () หลัง app.AddMvc () และมันไม่ทำงาน เนื่องจากวิธีการใช้งานมีผลต่อวิธีการทำงานของมิดเดิลแวร์!
Obay Abd-Algader

1
มีความเสี่ยงใด ๆ ในการอนุญาตให้กำเนิดหรือไม่?
Percy

คำตอบนี้ไม่ได้ผลสำหรับฉันเพราะแพ็คเกจ Microsoft Nuget ที่หายไปของ Microsoft.AspNetCore.Cors
Reven

108

ใช้กับ. NET Core 1 และ. Net Core 2 (เพิ่มเติมลงไป)

หากใช้งาน .Net-Core 1.1

น่าเสียดายที่เอกสารนั้นสร้างความสับสนในกรณีนี้โดยเฉพาะ ดังนั้นฉันจะทำให้มันง่าย - ตาย:

  • เพิ่มMicrosoft.AspNetCore.Corsแพ็คเกจ nuget ให้กับโครงการของคุณ
  • ในConfigureServicesวิธีการเพิ่มservices.AddCors();
  • ในConfigureวิธีการก่อนโทรapp.UseMvc()และapp.UseStaticFiles()เพิ่ม:

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

แค่นั้นแหละ. ลูกค้าทุกคนสามารถเข้าถึง ASP.NET Core เว็บไซต์ / API ของคุณได้


หากใช้งาน .Net-Core 2.0

  • เพิ่มMicrosoft.AspNetCore.Corsแพ็คเกจ nuget ให้กับโครงการของคุณ
  • ในConfigureServicesวิธีการก่อนโทรservices.AddMvc()เพิ่ม:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (สำคัญ)ในConfigureวิธีการก่อนโทรapp.UseMvc()เพิ่ม app.UseCors("AllowAll");

    AllowAllเป็นชื่อนโยบายที่เราจำเป็นต้องกล่าวถึงใน app.UserCors อาจเป็นชื่ออะไรก็ได้


2
จริงฉันคิดว่าฉันสามารถเปิดใช้งานเพียงหนึ่งในนั้น!
eugeneK

7
ขอบคุณ ฉันมี AddCors ของฉันหลังจาก UseMvc และนั่นทำให้การทำงานไม่ถูกต้อง คุณเป็นคำตอบเดียวที่กล่าวถึงนี้
JesseNewman19

1
มันใช้งานไม่ได้ฉันไม่คิด เมื่อระบุข้อมูลรับรองคุณไม่สามารถอนุญาตแหล่งกำเนิดได้ ฉันยังคงพยายามทำให้มันใช้งานได้
Jason Goemaat

7
นั่นคือชิ้นส่วนที่สำคัญ: .UseCors()ก่อน.UseMvc()
Neps

3
เสียเวลาไปกับไม่รู้เรื่อง UseCors ก่อน UserMvc ... ขอบคุณสำหรับความช่วยเหลือ!
โทมัส

37

จากคำตอบของ Henkฉันสามารถสร้างโดเมนเฉพาะวิธีที่ฉันต้องการอนุญาตและส่วนหัวที่ฉันต้องการเปิดใช้งาน CORS สำหรับ:

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

การใช้งาน:

[EnableCors("AllowSpecific")]

สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้แต่งโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
zrvan

14
To critique or request clarification from an authorฉันไม่คิดว่าเป็นอย่างนี้และคำตอบของ Henk ได้ถูกทำเครื่องหมายไว้แล้ว คำตอบของฉันคือส่วนเสริมหากคุณต้องการอนุญาตโดเมนเฉพาะ
Oluwafemi

มีบางอย่างในรหัสของคุณ 'IServiceCollection' ไม่มีคำจำกัดความสำหรับ 'ConfigureCors' โปรดตรวจสอบและลองตอบคำถามโดยสมบูรณ์
Sami-L

@ Sami-L โปรดตรวจสอบคำตอบที่อัปเดตของฉัน ผมพบว่าได้เปลี่ยนไปConfigureCors AddCors
Oluwafemi

9

โดยเฉพาะใน dotnet core 2.2 ด้วย SignalR คุณต้องเปลี่ยน

.WithOrigins("http://localhost:3000") หรือ

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

แทน.AllowAnyOrigin()ด้วย.AllowCredentials()

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

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


การใช้ SignalR ในแอปคอนโซล. NET Core และนี่เป็นโซลูชันเดียวที่ทำงานได้กับสถานการณ์ของฉัน
asdf

7

หากคุณโฮสต์บน IIS เหตุผลหนึ่งที่เป็นไปได้คือคุณได้รับสิ่งนี้เพราะ IIS กำลังบล็อกOPTIONSคำกริยา ฉันใช้เวลาเกือบชั่วโมงเพราะเหตุนี้:

หนึ่งตัวบ่งชี้ปากโป้งคือคุณได้รับ404ข้อผิดพลาดในระหว่างการOPTIONSร้องขอ

ในการแก้ไขปัญหานี้คุณต้องแจ้ง IIS อย่างชัดเจนไม่ให้บล็อกOPTIONSคำขอ

ไปที่การร้องขอการกรอง:

การกรองการร้องขอ IIS

ตรวจสอบให้แน่ใจว่าอนุญาตตัวเลือก:

ตรวจสอบให้แน่ใจว่าตัวเลือกเป็นจริง

หรือเพียงแค่สร้างweb.configด้วยการตั้งค่าต่อไปนี้:

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

7

คุณต้องกำหนดค่าในคลาส 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"));
        });            
    }

`


1
วิธีที่ยอดเยี่ยมในการหลีกเลี่ยงการรักษาความปลอดภัยเบราว์เซอร์ที่ปรับใช้แล้ว แค่อย่า!
JCKödel

2
ฉันไม่คิดว่าควรลงคะแนน นี่คือวิธี "ทางเลือก" คุณสามารถใช้เมธอด "UseCors ()" หรือเพิ่มตัวกรอง MVC ทั่วโลกเหมือนกับที่นาธานทำที่นี่
Josh Mouch

ใช้ได้กับฉันใน. net core 2.2 plus app.UseCors ("AllowAnyOrigin"); ในวิธี "กำหนดค่า"
Harry Sarshogh

เป็นสิ่งสำคัญที่จะ "เพิ่ม Microsoft.AspNetCore.Cors แพ็คเกจ nuget ให้กับโครงการของคุณ" ขอบคุณที่พูดถึงมัน!
Mason Zhang

5

เตรียมพร้อมใช้งานกับ. Net Core 3.1ดังนี้

1. ตรวจสอบให้แน่ใจว่าคุณวางรหัส UseCors ระหว่าง app.UseRouting (); และ app.UseAuthentication ();

        app.UseHttpsRedirection();

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

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

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

2. จากนั้นวางรหัสนี้ในวิธีการ ConfigureServices

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

3. และเหนือฐานควบคุมฉันวางมันไว้

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

ตอนนี้ตัวควบคุมทั้งหมดของฉันจะสืบทอดจาก BaseController และจะเปิดใช้งาน CORS


สิ่งต่าง ๆ ที่ทำงานให้ฉันจนกระทั่งฉันplace the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014

1

ขั้นตอนที่ 1: เราต้องการแพ็คเกจ Microsoft.AspNetCore.Cors ในโครงการของเรา สำหรับการติดตั้งไปที่เครื่องมือ -> ตัวจัดการแพ็คเกจ NuGet -> จัดการแพคเกจ NuGet สำหรับโซลูชัน ค้นหา Microsoft.AspNetCore.Cors และติดตั้งแพ็คเกจ

ขั้นตอนที่ 2: เราจำเป็นต้องฉีด CORS ลงในคอนเทนเนอร์เพื่อให้แอปพลิเคชันสามารถใช้งานได้ ในชั้นเรียน Startup.cs ไปที่วิธี ConfigureServices แล้วลงทะเบียน CORS

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นในแอพเซิร์ฟเวอร์ของเราไปที่ Controllers -> HomeController.cs และเพิ่มมัณฑนากร EnableCors ไปที่วิธีการทำดัชนี (หรือตัวควบคุมและการกระทำเฉพาะของคุณ):

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับรายละเอียดเพิ่มเติมคลิกที่นี่


0

วิธีแก้ปัญหาทั้งหมดที่กล่าวถึงข้างต้นอาจใช้งานได้หรืออาจไม่ทำงานในกรณีส่วนใหญ่จะไม่ทำงาน ฉันได้แก้ปัญหาที่นี่

ขณะนี้ฉันกำลังทำงานกับ Angular และ Web API (.net Core) และพบกับปัญหา CORS ที่อธิบายไว้ด้านล่าง

วิธีแก้ปัญหาที่ให้ไว้ข้างต้นจะใช้ได้เสมอ ด้วยการร้องขอ 'ตัวเลือก' มันจำเป็นจริงๆที่จะต้องเปิดใช้งาน 'การพิสูจน์ตัวตนแบบไม่ระบุชื่อ' ด้วยโซลูชันที่กล่าวถึงที่นี่คุณไม่ต้องทำตามขั้นตอนทั้งหมดที่กล่าวถึงข้างต้นเช่นการตั้งค่า IIS

อย่างไรก็ตามมีคนทำเครื่องหมายโพสต์ข้างต้นของฉันซ้ำกับโพสต์นี้ แต่ฉันเห็นว่าโพสต์นี้เปิดใช้งาน CORS ใน ASP.net Core เท่านั้น แต่โพสต์ของฉันเกี่ยวข้องกับการเปิดใช้งานและการใช้ CORS ใน ASP.net Core และ Angular

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.