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.