5

To byłby duplikat How does Access-Control-Allow-Origin header work?, ale metoda tam również nie działa dla mnie. Mam nadzieję, że czegoś mi brakuje..NET Core UseCors() nie dodaje nagłówków

Próbuję uzyskać nagłówek Access-Control-Allow-Origin w mojej odpowiedzi z mojego .NET Core Web API, do którego uzyskuję dostęp przez AJAX.

Próbowałem kilku rzeczy. Wszystkie, o ile nie zaznaczono inaczej, znajdują się w pliku Startup.cs.

Metoda 1

Jak na Microsoft Documentation:

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

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

    // ... 
} 

Próbowałem zostały również dodanie [EnableCors("AllowWebApp")] zarówno na kontrolerze i metody.

Od Postman, otrzymuję:

zawartość kodowanie → gzip
Content-Type → text/plain; charset = UTF-8
data → Wed, 25 Jan 2017 04:51:48 GMT
serwer → Kestrel
stan → 200
zmieniać → Accept-Encoding
x-zasilane przez → ASP.NET
x-sourcefiles → =? UTF-8? B? [ZMIENIONO]

Próbowałem również w Chrome i uzyskałem podobne nagłówki.

Jeśli jest to ważne, metoda, do której próbuję uzyskać dostęp, ma atrybut Authorize. Ale ta część powinna działać poprawnie (przynajmniej otrzymuję dobrą odpowiedź)

Czy brakuje mi czegoś oczywistego, czy to się zepsuło? Obecnie korzystam z wersji 1.1.0.


Edit dodanie JS i Controller Stub

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

Controller Stub

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

W jaki sposób trafiasz na serwer z Postmanem? Nagłówek zostanie zwrócony tylko dla żądania OPTIONS – Rob

+0

@Rob. Tego właśnie mi brakowało. W mniejszym stopniu na stronie Postmana (próbowałem go również w Chrome, i to było przy użyciu właściwej metody), a jeszcze bardziej po stronie kontrolera. Miałem '[HttpGet]' zamiast '[HttpOptions]'. Miałem przeczucie, że to coś tak głupiego. – David

+0

@Rob, jednak Chrome wciąż nie działa. Występuje błąd 204. Listonosz działa idealnie. Oba używają tego samego znacznika okaziciela. Pamięć podręczna jest wyłączona w przeglądarce Chrome. – David

Odpowiedz

6

Problemem jest to, że podczas korzystania z uwierzytelniania doręczyciela (lub każdy to sobie wyobrazić), dodaje nagłówek "Autoryzacja", a serwer daje tylko w porządku, jeśli konfiguracja dopuszcza ten nagłówek.

Istnieją dwa sposoby rozwiązania tego problemu, a poniżej wymagany jest kod tylko. Działa w metodzie Configure() w Startup.cs w rozwiązaniu Web API.

Metoda 1: Zezwól wszystkie nagłówki

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

Metoda 2: zezwolić określonym nagłówkom

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

Dodatkowe nagłówki są, bo za dokumentacji:

Przeglądarki nie są całkowicie składowe w jaki sposób ustawiają nagłówki żądania kontroli dostępu. Jeśli ustawisz nagłówki na cokolwiek innego niż "*", powinieneś uwzględnić przynajmniej "akceptuj", "typ zawartości" i "pochodzenie" oraz wszystkie niestandardowe nagłówki, które chcesz obsłużyć.