ASP.net Core WebAPI에서 CORS를 활성화하는 방법


189

내가하려는 일

Azure Free Plan (소스 코드 : https://github.com/killerrin/Portfolio-Backend )에서 호스팅되는 백엔드 ASP.Net Core Web API가 있습니다.

또한 API를 사용하려는 클라이언트 웹 사이트가 있습니다. 클라이언트 응용 프로그램은 Azure에서 호스팅되지 않지만 Github Pages 또는 내가 액세스 할 수있는 다른 웹 호스팅 서비스에서 호스팅됩니다. 이로 인해 도메인 이름이 정렬되지 않습니다.

이것을 살펴보면 웹 API 측에서 CORS를 활성화해야하지만 지금은 몇 시간 동안 거의 모든 것을 시도했지만 작동하지 않습니다.

클라이언트 설정 방법 React.js로 작성된 간단한 클라이언트입니다. Jquery에서 AJAX를 통해 API를 호출하고 있습니다. React 사이트가 작동하므로 그 사실을 알지 못합니다. Jquery API 호출은 시도 1에서 확인한대로 작동합니다. 다음은 호출 방법입니다.

    var apiUrl = "http://andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication";
    //alert(username + "|" + password + "|" + apiUrl);
    $.ajax({
        url: apiUrl,
        type: "POST",
        data: {
            username: username,
            password: password
        },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            var authenticatedUser = JSON.parse(response);
            //alert("Data Loaded: " + authenticatedUser);
            if (onComplete != null) {
                onComplete(authenticatedUser);
            }
        },
        error: function (xhr, status, error) {
            //alert(xhr.responseText);
            if (onComplete != null) {
                onComplete(xhr.responseText);
            }
        }
    });

내가 시도한 것


시도 1- '적절한'방법

https://docs.microsoft.com/en-us/aspnet/core/security/cors

Microsoft 웹 사이트의이 자습서를 따라 T를 시작했습니다. Startup.cs에서 전역으로 활성화하고 모든 컨트롤러에서 설정하고 모든 작업에서 시도하는 세 가지 옵션을 모두 시도했습니다.

이 방법에 따라 교차 도메인이 작동하지만 단일 컨트롤러 (POST to AccountController)의 단일 작업에서만 작동합니다. 다른 모든 경우에 Microsoft.AspNetCore.Cors미들웨어는 헤더 설정을 거부합니다.

Microsoft.AspNetCore.CorsNUGET을 통해 설치 했으며 버전은1.1.2

다음은 Startup.cs에서 설정하는 방법입니다.

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Cors
        services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
        {
            builder.AllowAnyOrigin()
                   .AllowAnyMethod()
                   .AllowAnyHeader();
        }));

        // Add framework services.
        services.AddMvc();
        services.Configure<MvcOptions>(options =>
        {
            options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy"));
        });

        ...
        ...
        ...
    }

    // This method gets called by the runtime. Use this method to configure 
    //the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env,
    ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        // Enable Cors
        app.UseCors("MyPolicy");

        //app.UseMvcWithDefaultRoute();
        app.UseMvc();

        ...
        ...
        ...
    }

보시다시피, 나는 지시대로 모든 것을하고 있습니다. MVC 앞에 Cors를 두 번 추가하고 작동하지 않을 때 [EnableCors("MyPolicy")]모든 컨트롤러를 배치하려고 시도했습니다.

[Route("api/[controller]")]
[EnableCors("MyPolicy")]
public class AdminController : Controller

시도 2-무차별 강제

https://andrewlock.net/adding-default-security-headers-in-asp-net-core/

이전 시도에서 몇 시간 동안 시도한 후 헤더를 수동으로 설정하여 모든 응답에서 강제로 실행하도록 시도하여 무차별 적으로 시도하려고 생각했습니다. 이 튜토리얼을 따라 모든 응답에 헤더를 수동으로 추가하는 방법에 대해이 작업을 수행했습니다.

이들은 내가 추가 한 헤더입니다

.AddCustomHeader("Access-Control-Allow-Origin", "*")
.AddCustomHeader("Access-Control-Allow-Methods", "*")
.AddCustomHeader("Access-Control-Allow-Headers", "*")
.AddCustomHeader("Access-Control-Max-Age", "86400")

이것들은 내가 시도한 다른 헤더입니다.

.AddCustomHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "content-type, accept, X-PINGOTHER")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Host, User-Agent, Accept, Accept: application/json, application/json, Accept-Language, Accept-Encoding, Access-Control-Request-Method, Access-Control-Request-Headers, Origin, Connection, Content-Type, Content-Type: application/json, Authorization, Connection, Origin, Referer")

이 방법을 사용하면 크로스 사이트 헤더가 올바르게 적용되고 개발자 콘솔과 Postman에 표시됩니다. 그러나 문제는 Access-Control-Allow-Origin수표를 통과하는 동안 웹 브라우저가 (내가 믿는) Access-Control-Allow-Headers진술 에 히스토리를 던진다는 것입니다415 (Unsupported Media Type)

따라서 무차별 강제 방법도 작동하지 않습니다


드디어

누구 든지이 일을하고 손을 빌려 줄 수 있습니까, 아니면 올바른 방향으로 나를 가리킬 수 있습니까?


편집하다

따라서 API 호출을 통과하려면 JQuery 사용을 중단하고 순수 자바 스크립트 XMLHttpRequest형식으로 전환해야했습니다 .

시도 1

나는 그럭저럭 Microsoft.AspNetCore.Cors, MindingData의 대답에 따라 대한 작업은이를 제외 Configure퍼팅 방법 app.UseCors전에 app.UseMvc.

또한 options.AllowAnyOrigin()와일드 카드 지원을 위해 Javascript API 솔루션과 혼합 될 때도 작동하기 시작했습니다.

시도 2

그래서 와일드 카드 Access-Control-Allow-Origin가 작동하지 않는다는 유일한 예외를 제외하고는 시도 2 ​​(브 루트 강제)가 작동 하도록했습니다. 따라서 액세스 할 수있는 도메인을 수동으로 설정해야합니다.

이 WebAPI가 모든 사람에게 널리 개방되기를 원하기 때문에 이상적이지는 않지만 분명히 별도의 사이트에서 작동합니다.

app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
    .AddDefaultSecurePolicy()
    .AddCustomHeader("Access-Control-Allow-Origin", "http://localhost:3000")
    .AddCustomHeader("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, PATCH, DELETE")
    .AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Content-Type, Authorization"));

2
415 (Unsupported Media Type)문제의 경우 Content-Type요청 헤더를로 설정 하십시오 application/json.
Technetium

5
설명적인 질문을 작성하는 데 시간을 보내 주셔서 감사합니다.
user1007074

1
Postman을 사용하여 테스트하는 경우 Origin을 * 또는 요청 헤더로 설정했는지 확인하면 시도 # 1이 작동합니다. 이 헤더가 없으면 Access-Control-Allow-Origin이 응답 헤더에 반환되지 않습니다.
tala9999

답변:


238

매우 간단한 CORS 정책 (XXX 도메인의 모든 요청 허용)이 있으므로 그렇게 복잡하게 만들 필요는 없습니다. 다음을 먼저 시도하십시오 (CORS의 매우 기본적인 구현).

아직 CORS nuget 패키지를 설치하지 않은 경우 설치하십시오.

Install-Package Microsoft.AspNetCore.Cors

startup.cs의 ConfigureServices 메소드에서 CORS 서비스를 추가하십시오.

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(); // Make sure you call this previous to AddMvc
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

그런 다음 startup.cs의 Configure 메소드에서 다음을 추가하십시오.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // Make sure you call this before calling app.UseMvc()
    app.UseCors(
        options => options.WithOrigins("http://example.com").AllowAnyMethod()
    );

    app.UseMvc();
}

이제 가자. 정책은 다른 작업 (예 : 다른 호스트 또는 다른 헤더)에 대해 다른 정책을 원할 때 사용됩니다. 간단한 예제에서는 실제로 필요하지 않습니다. 이 간단한 예제부터 시작하여 필요에 따라 조정하십시오.

추가 자료 : http://dotnetcoretutorials.com/2017/01/03/enabling-cors-asp-net-core/


3
XMLHttpRequest는 andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication을 로드 할 수 없습니다 . 프리 플라이트 요청에 대한 응답이 액세스 제어 확인을 통과하지 못함 : 요청 된 리소스에 'Access-Control-Allow-Origin'헤더가 없습니다. 따라서 출발지 ' localhost : 3000 '은 액세스가 허용되지 않습니다. 응답의 HTTP 상태 코드는 415입니다.
killerrin

7
당신이 등록 할 때, 직장에 갈 가능성이 app.UseCors AFTER ()```app.UseMvc합니다. 미들웨어는 등록 된 순서대로 실행됩니다.
Tseng

24
Configure 메서드에서 app.UseMvc 전에 app.UseCors를 사용하면 작동하는 것 같습니다. 어떤 이유로 시퀀스가 ​​중요해 보입니다.
MrClan

1
나에게있어 CORS 2.0의 가장 큰 문제는 무엇이 잘못되었는지 알려주지 않고 단지 CORS 헤더를 설정하지 못하는 것입니다. 참고 : 필요한 모든 헤더를 정책에 추가해야합니다. 그렇지 않으면 실패합니다 (콘텐츠 유형이 있음). 또한 CORS 미들웨어가 요청 처리를 제동하지 않고 원산지가 허용되지 않는다는 로그를 알리는 것만으로 이상합니다. 요청을 더 전달합니다 (미들웨어 순서가 정확함).
Andrii M4n0w4R

2
options.DisableHttpsRequirement();이 중 하나가 작동 하려면 활성화 해야했습니다. https cors 설정이 적용되지 않은 것 같습니다.
Michael Brown

208
  • 에서 ConfigureServices 추가 services.AddCors(); services.AddMvc () 전에;

  • Configure 에서 UseCors 추가

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

요점은 app.UseCors전에 추가하는 것 app.UseMvc()입니다.

MVC 파이프 라인이 제어를 요청하고 요청을 종료하기 전에 미들웨어가 시작되도록 MVC 전에 CORS 기능을 선언해야합니다.

위의 방법이 작동하면 API 호출을 수락하고 API를 다른 사람에게 공개하지 않도록 특정 ORIGIN을 구성하도록 변경할 수 있습니다

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options => options.AddPolicy("ApiCorsPolicy", builder =>
    {
        builder.WithOrigins("http://localhost:4200").AllowAnyMethod().AllowAnyHeader();
    }));

    services.AddMvc();
}

configure 메소드에서 방금 작성한 정책을 사용하도록 CORS에 지시하십시오.

app.UseCors("ApiCorsPolicy");
app.UseMvc();

방금이 주제에 대한이 소형 기사를 발견했습니다-https: //dzone.com/articles/cors-in-net-core-net-core-security-part-vi


1
이것은 나를 위해 작동합니다. codeproject.com/Articles/1150023/…
hubert17

17
이것은 좋은 "시작"지점으로 더 많은지지를 받아야합니다. 25 년이 넘는 코딩 경험에서 플러드 게이트를 열어 실제로 "작동"하는지 확인한 다음 필요에 따라 사물을 닫고 보호하는 방법을 아는 것이 좋습니다.
Indy-Jones

4
이 점을 언급하는 것만으로 Configure(), 주문 과 달리 여기에서 실제로 중요하지는 않습니다.ConfigureServices()
B12Toaster

추가 리더에서 링크를 사용했으며이 단계에서이 오류가 해결되었습니다. 이러한 변경 사항을 어디에 배치해야할지 잘 모르겠습니다 (API 생각). 링크는 API에 배치해야 함을 확인했습니다. 도와 주셔서 감사합니다. 이 오류로 바퀴를 완전히 돌리고있었습니다.
Richard

1
참고-CORS 사양에서는 Access-Control-Allow-Credentials 헤더가 있으면 원본을 "*"(모든 원본)로 설정하는 것이 유효하지 않다고 명시하고 있습니다. 당신이 사용할 수 없습니다 의미 AllowCredentials()AllowAnyOrigin()위와 같이. 사용하려면 AllowCredentials()을 설정해야합니다 WithOrigins(). docs.microsoft.com/en-us/aspnet/core/security/…
Nick De Beer

28

나를 위해 일한 내 자신의 미들웨어 클래스를 만들었습니다. .net 코어 미들웨어 클래스에 문제가 있다고 생각합니다.

public class CorsMiddleware
{
    private readonly RequestDelegate _next;

    public CorsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext httpContext)
    {
        httpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        httpContext.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
        httpContext.Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name");
        httpContext.Response.Headers.Add("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");
        return _next(httpContext);
    }
}

// Extension method used to add the middleware to the HTTP request pipeline.
public static class CorsMiddlewareExtensions
{
    public static IApplicationBuilder UseCorsMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<CorsMiddleware>();
    }
}

그리고 startup.cs에서 이런 식으로 사용했습니다.

app.UseCorsMiddleware();

Access-Control-Allow-Origin을 실행하는 매우 우아한 방법입니다.
Artur Poniedziałek

이것은 WebAPI 및 MVC에서 작동하며 종속성이 없습니다. 감사합니다!
Joe

나는 이것에 대해서도 회의적이지만 나에게 효과적이었다. 인터넷에서 찾을 수있는이를 달성하기 위해 기본적으로 다른 모든 방법을 시도했지만 서버가 액세스 헤더로 응답하지 않는 경우에도 마찬가지입니다. 이것은 훌륭하게 작동했습니다. aspnetcore 2.1을 실행 중입니다.
Jordan

클라이언트가 요청시 헤더 "Origin"을 보내는 경우에만 cors 헤더를 반환해야합니다. 오리지널 CospMiddleware에서 다음과 같이 보입니다 :if (!context.Request.Headers.ContainsKey(CorsConstants.Origin)) return this._next(context);
Andrew Prigorshnev

1
curl 또는 이와 유사한 것으로 테스트 할 때 헤더 "Origin"을 추가하지 않기 때문에 ".net 코어 미들웨어 클래스에 문제가있을 수 있습니다." js 코드로 요청하면 브라우저가이 헤더를 자동으로 추가합니다.
Andrew Prigorshnev

18

필자의 경우 getMindingData의 답변에 따라 요청 만 잘 작동합니다. 다른 유형의 요청의 경우 다음을 작성해야합니다.

app.UseCors(corsPolicyBuilder =>
   corsPolicyBuilder.WithOrigins("http://localhost:3000")
  .AllowAnyMethod()
  .AllowAnyHeader()
);

추가하는 것을 잊지 마십시오 .AllowAnyHeader()


AllowAnyHeader ()가 필요하다는 Towhid에 동의하십시오. HEADER의 요청에 누락 된 경우 서버가 OPTIONS 요청을 수신 할 수 있습니다.
Rivon

.AllowAnyHeader ()가 저를 위해 해냈으므로 프리 플라이트 응답에 문제가있었습니다.
takaz

11

user8266077답변 을 확장 하기 위해 .NET Core 2.1-preview에서 유스 케이스에 대한 프리 플라이트 요청 에 대한 OPTIONS 응답을 여전히 제공해야한다는 것을 알았습니다 .

// https://stackoverflow.com/a/45844400
public class CorsMiddleware
{
  private readonly RequestDelegate _next;

  public CorsMiddleware(RequestDelegate next)
  {
    _next = next;
  }

  public async Task Invoke(HttpContext context)
  {
    context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    // Added "Accept-Encoding" to this list
    context.Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Accept-Encoding, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name");
    context.Response.Headers.Add("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");
    // New Code Starts here
    if (context.Request.Method == "OPTIONS")
    {
      context.Response.StatusCode = (int)HttpStatusCode.OK;
      await context.Response.WriteAsync(string.Empty);
    }
    // New Code Ends here

    await _next(context);
  }
}

Startup.cs에서 미들웨어를 활성화했습니다.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseMiddleware(typeof(CorsMiddleware));
  // ... other middleware inclusion such as ErrorHandling, Caching, etc
  app.UseMvc();
}

1
그런 식으로 미들웨어를 추가하는 것이 좋습니다.app.Use<CorsMiddleware>();
Albert221

이 두 가지 리그를 대체 할 수 있습니다. context.Response.StatusCode = (int) HttpStatusCode.OK; Await context.Response.WriteAsync (string.Empty); 간단한 : return;
Hayha

1
@ user8266077의 답변 확장으로 확장하려면 다른 이유로 요청이 실패하면이 미들웨어에서 예외가 발생하고 헤더가 설정되지 않습니다. 프론트 엔드에서는 완전히 다른 문제이지만 여전히 CORS 문제처럼 보입니다. 나는 예외를 포착 await _next(context)하고이 상황이 발생하면 상태 코드와 응답을 수동으로 설정하여 이것을 우회했습니다 . 또한 권한 부여가 필요한 반응에서 요청을 수행 할 때 프리 플라이트 요청이 작동하려면 Access-Control-Allow-Headers에 "권한 부여"를 추가해야했습니다.
Adam

11
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {      
       app.UseCors(builder => builder
                .AllowAnyHeader()
                .AllowAnyMethod()
                .SetIsOriginAllowed((host) => true)
                .AllowCredentials()
            );
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors();
    }

.SetIsOriginAllowed ((host) => true) 나를 위해 해결했습니다.
JensB

와우, 나는 다른 답변들 중 어느 것도 3 표 밖에 안되는이 작은 답변 전에 효과가있을 것으로 기대했다. 그러나 나는 세 심하게 각 하나를 시도했습니다 ... ... 내가 당신을 위해 갔던 변덕에 그것은 효과가있었습니다. 감사합니다
roberto tomás

이것은 거의 모든 것을 허용하기 위해 .NET Core 3.1에서 나를 위해 일한 것입니다.
JustinHui

10

나는 DAYS를 위해 이것으로 고투하고 있었다.

app.UseCors(CORS_POLICY);TOP 으로 이동 하여 마침내 작동하게되었습니다 Configure().

https://weblog.west-wind.com/posts/2016/sep/26/aspnet-core-and-cors-gotchas

MVC가 요청을 완료하기 전에 헤더를 적용해야하므로> MVC 전에 CORS 기능을 선언해야합니다.

<= 내 앱이 전화하지 않았지만 맨 위로 UseMVC()이동 UseCors()하면 문제가 해결되었습니다.

또한:

  • Microsoft.AspNetCore.Cors이전에는 .Net Core 2 이하에서 필요한 NuGet 패키지였습니다. 이제 .Net Core 3 이상의 Microsoft.AspNetCore에 자동으로 포함됩니다.
  • builder.AllowAnyOrigin().AllowCredentials()CORS 옵션은 이제 닷넷 코어 3 이상에서 상호 배타적
  • CORS 정책에 따라 Angular에서 서버를 호출해야합니다 https. .Net Core 서버의 CORS 구성에 관계없이 http URL에서 CORS 오류가 발생하는 것 같습니다. 예를 들어 http://localhost:52774/api/ContactsCORS 오류가 발생합니다. https://localhost:44333/api/Contacts작동 하도록 URL을 변경하기 만하면 됩니다.

추가 사항 :

필자의 경우 CORS는 app.UseCors()위로 이동할 때까지 작동하지 않습니다 app.UseEndpoints(endpoints => endpoints.MapControllers()).


2
Net Core 3을 사용하는 경우 이것이 정답입니다. 내 생명을 구해 주셔서 감사합니다!
캐나다 완

2
"엔드 포인트 라우팅을 사용하면 UseRouting 및 UseEndpoints 호출간에 CORS 미들웨어를 실행하도록 구성해야합니다. 올바르지 않은 구성으로 인해 미들웨어가 올바르게 작동하지 않습니다." 여기 docs.microsoft.com/en-us/aspnet/core/security/…
Mark Schultheiss

"엔드 포인트 라우팅을 사용하면 UseRouting 및 UseEndpoints 호출간에 CORS 미들웨어를 실행하도록 구성해야합니다. 올바르지 않은 구성으로 인해 미들웨어가 올바르게 작동하지 않습니다." 여기 docs.microsoft.com/en-us/aspnet/core/security/…
Mark Schultheiss

7

위의 절차 중 어느 것도 도움이되지 않았 으며 문제를 해결 한 기사 를 읽었습니다 .

아래는 코드입니다.

public void ConfigureServices(IServiceCollection services)
{
    // Add service and create Policy with options
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials() );
    });


    services.AddMvc(); 
}

public void Configure(IApplicationBuilder app)
{
    // ...

    // global policy - assign here or on each controller
    app.UseCors("CorsPolicy");

내 행동 방법의 상단에

[EnableCors("CorsPolicy")]

2
이것은 아마도 나쁜 생각입니다. 같은 응용 프로그램에서 미들웨어 ( app.UseCors())를 섞어서는 안됩니다 [EnableCors()]. 당신은 하나 또는 다른 사용해야합니다 -하지만 모두 : docs.microsoft.com/en-us/aspnet/core/security/... :Use the [EnableCors] attribute or middleware, not both in the same app.
FoggyDay

4

jQuery.support.cors = true;Ajax 호출 전에 추가해보십시오

API로 보내는 데이터가 불안정 할 수도 있습니다.

다음 JSON 함수를 추가하십시오.

        var JSON = JSON || {};

    // implement JSON.stringify serialization
    JSON.stringify = JSON.stringify || function (obj) {

        var t = typeof (obj);
        if (t != "object" || obj === null) {

            // simple data type
            if (t == "string") obj = '"' + obj + '"';
            return String(obj);

        }
        else {

            // recurse array or object
            var n, v, json = [], arr = (obj && obj.constructor == Array);

            for (n in obj) {
                v = obj[n]; t = typeof (v);

                if (t == "string") v = '"' + v + '"';
                else if (t == "object" && v !== null) v = JSON.stringify(v);

                json.push((arr ? "" : '"' + n + '":') + String(v));
            }

            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
        }
    };

    // implement JSON.parse de-serialization
    JSON.parse = JSON.parse || function (str) {
        if (str === "") str = '""';
        eval("var p=" + str + ";");
        return p;
    };

그런 다음 데이터에서 객체를 다음으로 변경하십시오.

    data: JSON.stringify({
        username: username,
        password: password
    }),

당신의 도움을 주셔서 감사합니다. 모든 답변을 결합한 후 결국 해결책을
찾기

4

가장 간단한 해결책은 추가입니다

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseCors(options => options.AllowAnyOrigin());

        app.UseHttpsRedirection();
        app.UseMvc();
    }

Startup.cs에.


3

CORS 미들웨어 를 사용하는 경우 오리진 헤더 를 확인하여 실제로 CORS 요청 인지 확인해야 한다고 생각합니다 .

 public class CorsMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IMemoryCache _cache;
    private readonly ILogger<CorsMiddleware> _logger;

    public CorsMiddleware(RequestDelegate next, IMemoryCache cache, ILogger<CorsMiddleware> logger)
    {
        _next = next;
        _cache = cache;
        _logger = logger;
    }
    public async Task InvokeAsync(HttpContext context, IAdministrationApi adminApi)
    {
        if (context.Request.Headers.ContainsKey(CorsConstants.Origin) || context.Request.Headers.ContainsKey("origin"))
        {
            if (!context.Request.Headers.TryGetValue(CorsConstants.Origin, out var origin))
            {
                context.Request.Headers.TryGetValue("origin", out origin);
            }

            bool isAllowed;
            // Getting origin from DB to check with one from request and save it in cache 
            var result = _cache.GetOrCreateAsync(origin, async cacheEntry => await adminApi.DoesExistAsync(origin));
            isAllowed = result.Result.Result;

            if (isAllowed)
            {
                context.Response.Headers.Add(CorsConstants.AccessControlAllowOrigin, origin);
                context.Response.Headers.Add(
                    CorsConstants.AccessControlAllowHeaders,
                    $"{HeaderNames.Authorization}, {HeaderNames.ContentType}, {HeaderNames.AcceptLanguage}, {HeaderNames.Accept}");
                context.Response.Headers.Add(CorsConstants.AccessControlAllowMethods, "POST, GET, PUT, PATCH, DELETE, OPTIONS");

                if (context.Request.Method == "OPTIONS")
                {
                    _logger.LogInformation("CORS with origin {Origin} was handled successfully", origin);
                    context.Response.StatusCode = (int)HttpStatusCode.NoContent;
                    return;
                }

                await _next(context);
            }
            else
            {
                if (context.Request.Method == "OPTIONS")
                {
                    _logger.LogInformation("Preflight CORS request with origin {Origin} was declined", origin);
                    context.Response.StatusCode = (int)HttpStatusCode.NoContent;
                    return;
                }

                _logger.LogInformation("Simple CORS request with origin {Origin} was declined", origin);
                context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                return;
            }
        }

        await _next(context);
    }

대단히 감사합니다. 나는 Access-Control-Allow-Origin서버에 의해 헤더가 발행되지 않은 이유를 스스로에게 묻는다 . 실제로 Origin헤더가없는 Postman을 통해 요청을 보냈습니다 . 이것은 나의 하루를 구했다! (또는 적어도 내 forenoon;))
Paul Kertscher

2

MindingData의 답변에 대한 귀하의 의견을 바탕으로 CORS와 아무런 관련이 없으며 정상적으로 작동합니다.

컨트롤러 작업이 잘못된 데이터를 반환하고 있습니다. HttpCode 415는 "지원되지 않는 미디어 유형"을 의미합니다. 이것은 잘못된 형식을 컨트롤러에 전달하거나 (예 : XML을 json 만 허용하는 컨트롤러에 전달) 잘못된 유형을 반환 할 때 (xml 만 반환하도록 선언 된 컨트롤러에서 Xml을 반환) 발생합니다.

나중에 [Produces("...")]행동 에 속성이 있는지 확인하십시오.


당신의 도움을 주셔서 감사합니다. 새로운 솔루션을 시도하고 발송 된 JSON 연주 그리고 내가 그것을도 캐릭터 라인 후 일을하고 작업에있어
killerrin

2

나를 위해, 그것은 내가 사용하고있는 코드와 관련이 없었습니다. Azure의 경우 사이드 메뉴에서 "CORS"항목 인 앱 서비스 설정으로 이동해야했습니다. 거기에 내가 요청한 도메인을 추가해야했습니다. 내가 그것을 가지고 일단, 모든 것이 마법이었다.


2

launchSettings.json의 iisSettings에서 anonymousAuthentication을 true로 설정하십시오.

"iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:4200/",
      "sslPort": 0
    }
  }

그런 다음 Startup.cs의 ConfigureServices에서 services.AddMvc 전에 다음을 추가하십시오.

services.AddCors(options => options.AddPolicy("ApiCorsPolicy", builder =>
{
    builder
        .AllowAnyOrigin()
        .WithHeaders(HeaderNames.AccessControlAllowHeaders, "Content-Type")
        .AllowAnyMethod()
        .AllowCredentials();
}));

그런 다음 configure 메소드에서 app.UseMvc () 전에 다음을 추가하십시오.

app.UseCors("ApiCorsPolicy");

이것은 나를 위해 그것을했습니다. 원래 Windows 인증을 위해 프로젝트를 설정했지만 익명으로 변경해야했습니다. CORS가 올바르게 구성되었지만 launchSettings.json 의이 설정이 범인이었습니다.이 글을 게시 해 주셔서 감사합니다!.
HaRoLD

2

.Net CORE 3.1을 사용하고 있으며 코드가 실제로 작동하기 시작했지만 디버깅 환경이 손상되었다는 것을 깨달았을 때 벽에 머리를 두드리는 데 오랜 시간을 보냈습니다. 따라서 문제를 해결하려는 경우 2 가지 힌트가 있습니다. 문제:

  1. ASP.NET 미들웨어를 사용하여 응답 헤더를 기록하려고하면 "Access-Control-Allow-Origin"헤더가 있어도 표시되지 않습니다. 어떻게 해야할지 모르겠지만 파이프 라인 외부에 추가 된 것 같습니다 (결국 그것을 보려면 wireshark를 사용해야했습니다).

  2. .NET CORE는 요청에 "Origin"헤더가 없으면 응답에 "Access-Control-Allow-Origin"을 보내지 않습니다. Postman은 이것을 자동으로 설정하지 않으므로 직접 추가해야합니다.


2

제 경우에는 UserRouting 전에 UseCors로 수정되었습니다.


dotnet core 2.2에서 3.1로 업그레이드했을 때 이와 비슷한 문제가 발생했습니다. app.UseCout ()을 app.UseRouting () 위로 옮겼습니다. 이 대답은 올바른 방향으로 나를 가리 켰습니다.
Brandonm

1

.NET 코어 3.1

나를 위해 일했고 문서가 어떻게하는지 :

스타트 업 수업에서 :

readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; 

ConfigureServices () 메소드에서 :

    services.AddCors(options =>
    {
        options.AddPolicy(MyAllowSpecificOrigins,
        builder =>
        {
            builder.WithOrigins("http://example.com",
                                "http://www.contoso.com");
        });
    });

Configure () 메소드에서 :

    app.UseCors(MyAllowSpecificOrigins);  

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1


0

위의 MindingData의 답변을 얻었지만 Microsoft.AspNetCore.Cors 대신 Microsoft.AspNet.Cors를 사용해야했습니다. Visual Studio 2019에서 .NetCore 웹 응용 프로그램 API 프로젝트를 사용하고 있습니다.


2
참고 : ASP.Net Cor 응용 프로그램에서 Microsoft.AspNet.Cors를 사용해서는 안됩니다. .Net Core 3.0 이상인 경우 CORS를 위해 NuGet 패키지를 전혀 가져올 필요가 없습니다. .Net Core 2.3 이하인 경우 NuGet의 적절한 Microsoft.AspNet.Cors 버전이 필요합니다.
FoggyDay

0

그만큼

Microsoft.AspNetCore.Cors

내장 기능으로 CORS를 수행 할 수 있지만 OPTIONS 요청은 처리하지 않습니다. 지금까지 가장 좋은 해결 방법은 이전 게시물에서 제안한대로 새 미들웨어를 작성하는 것입니다. 다음 게시물에서 정답으로 표시된 답변을 확인하십시오.

.NET Core Web API에서 CORS에 대한 OPTIONS 헤더 사용


0

간단하고 쉬운 방법입니다.

  1. 패키지 설치

Install-Package Microsoft.AspNetCore.Cors

  1. startup.cs 파일에 아래 코드를 넣으십시오.

app.UseCors(options => options.AllowAnyOrigin());


0

내 코드는 다음과 같습니다.)

  app.Use((ctx, next) =>
        {
            ctx.Response.Headers.Add("Access-Control-Allow-Origin", ctx.Request.Headers["Origin"]);
            ctx.Response.Headers.Add("Access-Control-Allow-Methods", "*");
            ctx.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
            ctx.Response.Headers.Add("Access-Control-Allow-Headers", "AccessToken,Content-Type");
            ctx.Response.Headers.Add("Access-Control-Expose-Headers", "*");
            if (ctx.Request.Method.ToLower() == "options")
            {
                ctx.Response.StatusCode = 204;

                return Task.CompletedTask;
            }
            return next();
        });

0

여기 내가 어떻게했는지.

나는 일부 답변 에서 컨트롤러를 설정 app.UserCors("xxxPloicy")하고 넣는 것을 알 수 있습니다 [EnableCors("xxxPloicy")]. 둘 다 할 필요는 없습니다.

단계는 다음과 같습니다.

ConfigureServices 내의 Startup.cs에 다음 코드를 추가하십시오.

    services.AddCors(c=>c.AddPolicy("xxxPolicy",builder => {
        builder.AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader();
    }));

프로젝트 전체에 적용하려면 Startup.cs의 메소드 구성에 다음 코드를 추가하십시오.

app.UseCors("xxxPolicy");

또는

특정 컨트롤러에 추가하려면 아래 표시된대로 enable cors 코드를 추가하십시오.

[EnableCors("xxxPolicy")]
[Route("api/[controller]")]
[ApiController]
public class TutorialController : ControllerBase {}

자세한 내용 다음을 참조하십시오


0

사용자 정의 조치 / 컨트롤러 속성을 사용하여 CORS 헤더를 설정하십시오.

예:

public class AllowMyRequestsAttribute : ControllerAttribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
        // check origin
        var origin = context.HttpContext.Request.Headers["origin"].FirstOrDefault();
        if (origin == someValidOrigin)
        {
            context.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", origin);
            context.HttpContext.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
            context.HttpContext.Response.Headers.Add("Access-Control-Allow-Headers", "*");
            context.HttpContext.Response.Headers.Add("Access-Control-Allow-Methods", "*");
            // Add whatever CORS Headers you need.
        }
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        // empty
    }
}

그런 다음 웹 API 컨트롤러 / 액션에서 :

[ApiController]
[AllowMyRequests]
public class MyController : ApiController
{
    [HttpGet]
    public ActionResult<string> Get()
    {
        return "Hello World";
    }
}

0

을 사용 app.UseHttpsRedirection()하고 있고 SSL 포트가 아닌 경우 여기에 대답하기 위해 추가하십시오 .


0

클라이언트로 asz.web 웹 API 코어와 백엔드로 blazor webassembly를 사용했으며 cors 문제도있었습니다.

이 코드로 솔루션을 찾았습니다.

내 ASP.Net 핵심 웹 API Startup.cs ConfigureServices 및 Configure 메서드 첫 줄은 다음과 같습니다.

public void ConfigureServices(IServiceCollection services)
{
   services.AddCors(options => options.AddPolicy("ApiCorsPolicy", builder =>
   {
        builder.WithOrigins("http://example.com").AllowAnyMethod().AllowAnyHeader();
    }));

 //other code below...
}

내 구성 방법 :

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseCors(
        options =>   options.WithOrigins("http://example.com").AllowAnyMethod().AllowAnyHeader()
            );
 //other code below...
}

변경 http://example.com클라이언트 도메인 또는 IP 주소와


-1
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .AddJsonOptions(options => {
                    var resolver = options.SerializerSettings.ContractResolver;
                    if (resolver != null)
                        (resolver as DefaultContractResolver).NamingStrategy = null;
                });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection"))); //Dependency Injection
            // options => options.UseSqlServer() Lamda Expression

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

코드에 대한 설명과 코드가 다른 답변과 어떻게 다른지 설명하도록 답변을 수정하십시오. 이렇게하면 게시물이 더 유용하고
업 보트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.