[C#] ASP.NET Core에서 CORS를 사용하도록 설정하는 방법

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

ASP.NET Core Web API에서 CORSpolicyName의미하는 방법과 의미 는 무엇입니까 ?



답변

다음 ConfigureServices방법으로 응용 프로그램 시작시 CORS 정책을 구성해야합니다 .

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

    // ...
}

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


답변

.NET Core 1 및 .Net Core 2에 적용

사용하는 경우 .Net-Core 1.1

불행히도 문서는이 특정 경우에 매우 혼란 스럽습니다. 그래서 나는 그것을 간단하게 만들 것입니다 :

  • Microsoft.AspNetCore.Cors프로젝트에 너겟 패키지 추가
  • 에서 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프로젝트에 너겟 패키지 추가
  • ConfigureServices방법 전에 호출 services.AddMvc()추가 :

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (중요) 에서 Configure방법, 전에 호출 app.UseMvc(), 추가 app.UseCors("AllowAll");

    AllowAllapp.UserCors에서 언급해야하는 정책 이름입니다. 어떤 이름이든 될 수 있습니다.


답변

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")]


답변

특히 SignalR이 포함 된 닷넷 코어 2.2에서는 반드시 변경해야합니다

.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


답변

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>


답변

Startup.cs 클래스에서 구성해야합니다

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


답변

`

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

`