Asp.NET Core:对服务的跨源请求(预检)返回代码204而不是200

use*_*686 2 cors asp.net-core

我有Asp.NET Core Web API应用程序并试图实现授权但遇到了CORS问题 - 我的开发服务和ui主机在localhost的不同端口上.

在登录页面上,我获得令牌并重定向到下一页.此时,对服务的数据请求开始.但服务器响应的状态为204:没有预检请求的内容...虽然,预检响应返回Access-Control-Allow-Origin:*...

Startup.cs看起来像:

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddCors(options =>
    {
        options.AddPolicy("Policy",
            builder => builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader() );
    });
    services.AddAuthorization();
    services.AddMvc() // ...


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseCors("Policy");
    app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)

我是否会错过服务器端的内容?(在客户端,angular的拦截器只添加带有令牌的Authorization头)

PS我在OSX上使用VS Code进行开发(尽管我认为这并不重要)

更新:

正如@tpeczek建议的那样,我将cors配置更改为:

        options.AddPolicy("Policy",
            builder => builder.WithOrigins("http://localhost:80", "http://localhost")
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials() );
Run Code Online (Sandbox Code Playgroud)

但无法摆脱错误

预检看起来像这样

更新2:

我得到的错误是

XMLHttpRequest cannot load localhost:5000/api/<method-name>;. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'localhost'; is therefore not allowed access. The response had HTTP status code 500.
Run Code Online (Sandbox Code Playgroud)

但是一旦我[Authorize]从控制器中删除属性,它就可以了.所以问题在于令牌检查?

更新3:问题在于意外删除了功能: - (立即工作

tpe*_*zek 13

204 NO CONTENT状态代码是完全合法CORS预检响应(见这里).

您的问题是由您请求包含Authorization标题的事实导致的,该标题使其成为"凭证请求".在这种情况下你不能使用通配符Access-Control-Allow-Origin,你必须指定Access-Control-Allow-Credentials(你可以在这里阅读更多)

services.AddCors(options =>
{
    options.AddPolicy("Policy", builder => builder
        .WithOrigins("<Origin One>", "<Origin Two>", ...)
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials()
    );
});
Run Code Online (Sandbox Code Playgroud)