Asp.NET Core:对服务的跨域请求(预检)返回代码 204 而不是 200
Posted
技术标签:
【中文标题】Asp.NET Core:对服务的跨域请求(预检)返回代码 204 而不是 200【英文标题】:Asp.NET Core: cross-origin request to services (preflight) returns code 204 instead of 200 【发布时间】:2017-08-09 02:30:23 【问题描述】:我有 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();
我是否错过了服务器端的某些内容? (在客户端 Angular 的拦截器上只是添加了带有令牌的授权标头)
附:我在 OSX 上使用 VS Code 进行开发(尽管我猜它并不重要)
更新:
按照@tpeczek 的建议,我已将 cors 配置更改为:
options.AddPolicy("Policy",
builder => builder.WithOrigins("http://localhost:80", "http://localhost")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials() );
但无法摆脱错误
更新 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.
但是一旦我从控制器中删除 [Authorize]
属性,它就可以正常工作。所以问题出在令牌检查上?
更新 3: 问题出在意外删除的功能中:-(现在可以使用
【问题讨论】:
204 NO CONTENT
您的控制器/中间件是否返回任何数据?
@JoelHarkes 中间件返回“等待 context.Response.WriteAsync(JsonConvert.SerializeObject(response, new JsonSerializerSettings Formatting = Formatting.Indented ));”获取令牌时。访问数据时,中间件不返回任何内容。未到达控制器。我使用的唯一中间件来自stormpath.com/blog/token-authentication-asp-net-core
@user1820686 从您上次的评论来看,CORS 的问题似乎不再存在,您已经通过了预检请求,现在您的应用中出现了其他错误。
请更新您的问题以包含该错误消息。那 500 表示服务器端存在与 CORS 无关的问题。该消息只是说您收到的 500 错误页面上没有 Access-Control-Allow-Origin。这不一定是问题,因为如果您找出导致服务器端 500 错误的原因并修复它,您就不会遇到它
@user1820686 关于您的上次更新,在我看来,最初您遇到了 CORS 问题(由于请求中的 Authorization
标头),现在您怀疑的区域可能存在不同的问题,这值得单独调查。
【参考方案1】:
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()
);
);
【讨论】:
我刚刚添加了 builder.WithOrigins("localhost:80", "localhost"),预检返回以下标题:Access-Control-Allow-Credentials:true Access-Control-Allow-Headers :authorization 和 Access-Control-Allow-Origin:localhost 但在主请求中遇到了同样的错误 @user1820686 正确的原始格式是<scheme> "://" <host> [ ":" <port> ]
。使它们正确的最简单方法是在请求的 Origin
标头中放入相同的内容。
显然直到 11 月。我刚刚为此浪费了半天时间:所有浏览器现在都已更新,它必须是“200”。 :(以上是关于Asp.NET Core:对服务的跨域请求(预检)返回代码 204 而不是 200的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core Web API + Angular 对预检请求的响应未通过访问控制检查:预检请求不允许重定向