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에서 CORSpolicyName의미하는 방법과 의미 는 무엇입니까 ?


답변:


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.