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


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

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


답변:


328

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

12
app.UseCors ( "MyPolicy")가 API 엔드 포인트에서 작동하지 않는 것을 발견했습니다. 문제의 컨트롤러 엔드 포인트에서 [EnableCors ( "MyPolicy")]를 명시 적으로 지정해야했습니다.
— robbpriestley 2016 년

9
에서 공식 문서 : 전체 응용 프로그램이 사용하여 요청 파이프 라인에 CORS가 미들웨어 추가를 위해 "CORS를 사용하려면 UseCors확장 방법을 참고를 CORS가 미들웨어 (예 : 당신이 출처 간 요청을 지원하려는 앱에 정의 된 엔드 포인트를 선행해야합니다. UseMvc)를 호출하기 전에
— Alex Klaus

2
app.AddMvc () 뒤에 app.UseCors ()를 추가했는데 작동하지 않았습니다. 사용 순서 방법은 미들웨어 작동 방식에 영향을주기 때문에!
— Obay Abd-Algader

1
원산지를 허용 할 위험이 있습니까?
— Percy

이 답변은 Microsoft.AspNetCore.Cors nuget 패키지가 없어서 효과가 없었습니다.
— Revend

108

.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에서 언급해야하는 정책 이름입니다. 어떤 이름이든 될 수 있습니다.


2
사실, 나는 그들 중 하나만 활성화 할 수 있다고 생각했습니다!
— eugeneK

7
감사. UseMvc 후에 내 AddCors가있어 제대로 작동하지 않습니다. 이것에 대한 유일한 대답은 당신의 것입니다.
— JesseNewman19

1
내가 생각하지 않는 작동하지 않습니다. 자격 증명을 제공 할 때는 원본을 허용 할 수 없습니다. 나는 여전히 이것이 작동하도록 노력하고 있습니다.
— Jason Goemaat

7
이것이 핵심입니다. .UseCors()이전.UseMvc()
— Neps

3
UserMvc 이전의 UseCors에 대해 알지 못해 시간을 낭비했습니다 ... 도움을 주셔서 감사합니다!
— 토마스

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

특히 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


.NET Core 콘솔 앱에서 SignalR을 사용하면 이것이 시나리오에서 유일하게 작동하는 솔루션입니다.
— 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 ()"메소드를 사용하거나 Nathan이 수행 한 것과 같은 글로벌 MVC 필터를 추가 할 수 있습니다.
— Josh Mouch

이것은 .net core 2.2와 app.UseCors ( "AllowAnyOrigin"); "구성"방법
— Harry Sarshogh

"프로젝트에 Microsoft.AspNetCore.Cors nuget 패키지를 추가하십시오"는 것이 중요합니다. 언급 해 주셔서 감사합니다!
— 메이슨 장

5

이것을 .Net Core 3.1 과 함께 사용했습니다. 에서 다음과 같이 합니다.

1. app.UseRouting () 사이에 UseCors 코드를 배치하십시오. 그리고 app.UseAuthentication ();

        app.UseHttpsRedirection();

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

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

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

그런 다음이 코드를 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가 활성화됩니다.


상황이 I 때까지 나를 위해 일하는를 werentplace 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 데코레이터를 Index 메소드 (또는 특정 컨트롤러 및 작업)에 추가하십시오.

여기에 이미지 설명을 입력하십시오

자세한 내용은 여기를 클릭하십시오


0

위에서 언급 한 모든 해결 방법이 작동하거나 작동하지 않을 수 있으며 대부분의 경우 작동하지 않습니다. 나는 여기에 해결책을주었습니다.

현재 Angular 및 Web API (.net Core)에서 일하고 있으며 아래 설명 된 CORS 문제가 발생했습니다.

위에 제공된 솔루션은 항상 작동합니다. 'OPTIONS'요청으로 '익명 인증'을 활성화해야합니다. 여기에 언급 된 솔루션을 사용하면 IIS 설정과 같이 위에서 언급 한 모든 단계를 수행하지 않아도됩니다.

어쨌든 누군가가 내 게시물을이 게시물과 중복으로 표시했지만이 게시물은 ASP.net Core에서 CORS를 사용하도록 설정 한 것이지만 ASP.net Core 및 Angular에서 CORS 활성화 및 구현과 관련이 있음을 알 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.