2017-03-17 70 views
1

我有Asp.NET核心Web API应用程序,并试图实现授权,但遇到CORS问题 - 我的开发服务和用户界面主机在本地主机的不同端口上。Asp.NET核心:跨服务请求(预检)返回代码204而不是200

在登录页面我得到令牌并重定向到下一页。此时数据请求服务启动。但随着状态204服务器响应:没有内容预检请求...... 虽然预检响应返回访问控制允许来源:* ...

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

我错过了服务器端的东西吗? (在客户端角度的拦截器只是添加授权标头与令牌)

P.S.我使用VS代码在OSX发展(尽管我想这并不重要)

UPDATE:

为@tpeczek谏,我已经改变CORS配置:

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

但可以”牛逼摆脱错误更新2

Preflight looks like this

我得到的错误是

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. 

但是,一旦我从控制器中删除[Authorize]属性,它工作正常。所以问题在于令牌检查?

更新3: 在意外删除的问题的功能: - (现在工作

+0

'204 NO CONTENT'您的控制器/中间件是否返回任何数据? –

+0

@JoelHarkes中间件返回“await context.Response.WriteAsync(JsonConvert.SerializeObject(response,new JsonSerializerSettings {Formatting = Formatting.Indented}));”当获得令牌时。去数据时,中间件不会返回任何东西。没有到达控制器。我使用的唯一中间件是从https://stormpath.com/blog/token-authentication-asp-net-core – user1820686

+0

得到的如果这仍然不起作用,请在问题中包含预检请求标头。 – tpeczek

回答

4

204 NO CONTENT状态代码是完全合法CORS预检响应(见here)从事实

你的问题的结果。您的请求包含Authorization表头,这使其成为“凭证请求”。在这种情况下,您不能使用通配符Access-Control-Allow-Origin,并且您必须指定Access-Control-Allow-Credentials(您可以阅读更多here

services.AddCors(options => 
{ 
    options.AddPolicy("Policy", builder => builder 
     .WithOrigins("<Origin One>", "<Origin Two>", ...) 
     .AllowAnyMethod() 
     .AllowAnyHeader() 
     .AllowCredentials() 
    ); 
}); 
+0

我刚刚添加builder.WithOrigins(“http:// localhost:80”,“http:// localhost”),preflight返回以下标题:Access-Control-Allow-Credentials:true Access-Control-Allow-Headers:授权和访问控制 - Allow-Origin:http:// localhost,但在主请求 – user1820686

+0

@ user1820686上得到了相同的错误源的正确格式是'“://” [“:”]'。让它们正确的最简单的方法是把请求的'Origin'头部中的东西放在同一个东西上。 – tpeczek

相关问题