5

이것은 How does Access-Control-Allow-Origin header work?의 복제본이 될 수 있지만 그 방법도 저를 위해 작동하지 않습니다. 내가 뭔가를 놓치기를 바라고있어..NET 코어 UseCors()는 헤더를 추가하지 않습니다

AJAX를 통해 액세스하고있는 .NET Core Web API에서 내 응답에 Access-Control-Allow-Origin 헤더를 가져 오려고합니다.

나는 여러 가지를 시도했다. 별도로 명시하지 않는 한 모두가 Startup.cs 파일에 있습니다. Microsoft Documentation 당으로 방법 1

:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add database 
    services.AddDbContext<DbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DbConnection"))); 

    // Add the ability to use the API with JSON 
    services.AddCors(); 

    // Add framework services. 
    services.AddMvc(); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 

    if (env.IsDevelopment()) 
    { 
     using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) 
     { 
      serviceScope.ServiceProvider.GetService<DbContext>().Database.Migrate(); 
      serviceScope.ServiceProvider.GetService<DbContext>().EnsureSeedData(); 
     } 
    } 

    app.UseCors(builder => builder.WithOrigins("https://localhost:44306").AllowAnyMethod()); 

    app.UseJwtBearerAuthentication(new JwtBearerOptions 
    { 
     Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"], 
     Audience = Configuration["Authentication:AzureAd:Audience"], 
    }); 

    app.UseMvc(); 
} 

방법은 2

public void ConfigureServices(IServiceCollection services) 
{ 
    // ... 

    services.AddCors(options => options.AddPolicy("AllowWebApp", 
     builder => builder.AllowAnyMethod() 
          .AllowAnyMethod() 
          .AllowAnyOrigin())); 
          //.WithOrigins("https://localhost:44306"))); 

    // ... 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    // ... 

    app.UseCors("AllowWebApp"); 

    // ... 
} 

나는 또한 컨트롤러 및 방법 모두에 [EnableCors("AllowWebApp")]를 추가하는 시도했습니다. 우체부에서

, 내가 얻을 :

컨텐츠 인코딩 → GZIP
콘텐츠 유형 → 텍스트/일반; 문자셋 = UTF-8
날짜 2017년 (수) 1월 25일 → 그리니치 표준시 04시 51분 48초
서버 황조롱이
→ 상태 → 200
다를 → 수락 인코딩
X가 구동 -에 의해
→ ASP.NET x-sourcefiles → =? UTF-8? B? [재실행]

나는 크롬에서도 비슷한 헤더를 사용했습니다.

액세스하려는 메소드에 Authorize 속성이 있습니다. 하지만 그 부분은 정상적으로 작동해야합니다 (적어도 좋은 응답을 얻고 있습니다).

그래서 나는 아주 분명한 것을 놓치고 있습니까? 현재 버전 1.1.0을 실행 중입니다. 베어러 인증을 이용하여 (또는 I가 상상) 때 JS 컨트롤러 스텁을 추가


편집

function getContactPreviews(resultsCallback) { 
    var xmlhttp = new XMLHttpRequest(); 

    xmlhttp.onreadystatechange =() => { 
     if (xmlhttp.readyState == XMLHttpRequest.DONE && xmlhttp.status == 200) { 
      resultsCallback(JSON.parse(xmlhttp.response)); 
     } 
    } 

    xmlhttp.open("GET", "https://localhost:44357/api/User/ContactsPreview", true); 
    xmlhttp.setRequestHeader("Authorization", "Bearer " + localStorage.getItem("AuthorizationToken")); 
    xmlhttp.send(); 
} 

컨트롤러 스텁

[Authorize] 
[Route("api/[controller]")] 
public class UserController : ApiController 
{ 
    [HttpGet(nameof(ContactsPreview))] 
    [EnableCors("AllowWebApp")] 
    public IEnumerable<Customer> ContactsPreview() 
    { 
     // ... 
    } 
} 
+0

어떻게 우편 배달부로 서버를 치십니까? 헤더는 OPTIONS 요청 – Rob

+0

@Rob에 대해서만 반환됩니다. 그게 내가 놓친거야. Postman 측에서는 (크롬에서 시도해 보았지만 올바른 방법을 사용하고있었습니다.) 컨트롤러 쪽에서는 더 그렇습니다. 나는 [HttpOptions] 대신'[HttpGet]'을 사용했다. 나는 그런 느낌이 들었어. – David

+0

@Rob 그러나 Chrome은 여전히 ​​실패하고 있습니다. 204 오류가 발생했습니다. 우편 배달부는 완벽하게 작동합니다. 둘 다 동일한 무기명 토큰을 사용하고 있습니다. Chrome에서 캐시가 사용 중지되었습니다. – David

답변

6

문제는, 그것이 추가되었는지 헤더 "Authorization"을 사용하고, 서버가 해당 헤더를 허용하는 경우에만 서버는 괜찮습니다.

문제를 해결하는 방법은 두 가지가 있으며, 아래에 코드 만 필요합니다. 코드가 필요합니다. 웹 API 솔루션의 Startup.cs에있는 Configure() 메소드로 이동합니다.

방법 1 : 모든 헤더가

app.UseCors(builder => builder.WithOrigins("https://localhost:44306") 
           .AllowAnyMethod() 
           .AllowAnyHeader()); 

방법 2 허용 : 특정 헤더

에게 허용
app.UseCors(builder => builder.WithOrigins("https://localhost:44306") 
           .AllowAnyMethod() 
           .WithHeaders("authorization", "accept", "content-type", "origin")); 

여분의 헤더입니다 때문에 문서 당 :

브라우저가 완전히 일치하지는 않습니다. 그들이 Access-Control-Request-Headers를 설정하는 방법에 대해 설명합니다. 헤더를 "*"이외의 것으로 설정하면 적어도 "accept", "content-type"및 "origin"과 지원하려는 모든 사용자 정의 헤더를 포함해야합니다.