usecors origin net falta enablecors control cabecera asp app allow all c# asp.net-core cors asp.net-core-webapi cross-domain-policy

c# - origin - .NET Core UseCors() no agrega encabezados



cors web api net core (1)

Esto sería un duplicado de ¿Cómo funciona el encabezado Access-Control-Allow-Origin? , pero el método allí tampoco funciona para mí. Espero que me esté perdiendo algo.

Estoy tratando de obtener un encabezado Access-Control-Allow-Origin en mi respuesta de mi .NET Core Web API, a la que estoy accediendo a través de AJAX.

He intentado varias cosas. Todos, a menos que se indique lo contrario, han estado en el archivo Startup.cs .

Método 1

Según la documentación de Microsoft :

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

Método 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"); // ... }

También intenté agregar [EnableCors("AllowWebApp")] tanto en el controlador como en el método.

De cartero, me sale:

codificación de contenido → gzip
tipo de contenido → texto / plano; charset = utf-8
Fecha → Miércoles, 25 de enero de 2017, 04:51:48 GMT
servidor → Cernícalo
estado → 200
variar → Aceptar-Codificar
x-powered-by → ASP.NET
x-sourcefiles → =? UTF-8? B? [ELIMINADO]

También lo probé en Chrome y obtuve encabezados similares.

Si es importante, el método al que intento acceder tiene un atributo Authorize . Pero esa parte debería estar funcionando bien (al menos tengo una buena respuesta)

Entonces, ¿me estoy perdiendo algo muy obvio, o esto se rompió? Actualmente estoy ejecutando la versión 1.1.0.

Edite agregando JS y 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(); }

Trozo de controlador

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


El problema es que cuando utilizo la autenticación de portador (o cualquiera que imagine), agrega un encabezado "Autorización", y el servidor solo dará una autorización si la configuración permite ese encabezado.

Hay dos formas de resolver el problema, y ​​a continuación se muestra el único código necesario. Va en el método Configure() en Startup.cs en la solución de API web.

Método 1: Permitir todos los encabezados

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

Método 2: Permitir encabezados específicos

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

Los encabezados adicionales son porque, según la documentación:

Los navegadores no son del todo consistentes en cómo establecen Access-Control-Request-Headers. Si configura los encabezados en un valor que no sea "*", debe incluir al menos "aceptar", "tipo de contenido" y "origen", además de los encabezados personalizados que desee.