我的Asp.Net5 Web Api无法在Chrome上运行,这是由于CORS问题,而且我的CORS配置似乎与我的OAuthBearerAuthentication冲突。 在我的Startup.cs中:
services.AddCors();
services.ConfigureCors(o => o.AddPolicy("AllowAll", p => p.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()));
我的控制器如下:
[Authorize(OAuthBearerAuthenticationDefaults.AuthenticationScheme)]
[EnableCors("AllowAll")]
public class MyController
然后我得到No 'Access-Control-Allow-Origin' header is present on the requested resource.
但是,如果我删除了authorize属性:
[EnableCors("AllowAll")]
public class MyController
然后我被允许......发生了什么事?
答案 0 :(得分:1)
您只需将以下内容添加到web.config文件的system.webServer
部分:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT" />
<add name="Access-Control-Allow-Headers" value="accept, content-length, content-type" />
</customHeaders>
</httpProtocol>
根据需要修改方法和标题。你不能在这些标题中使用*。它还允许您使用AJAX请求图像和HTML等内容,而不仅仅是控制器操作服务资源。
答案 1 :(得分:0)
首先,清除chrome上的缓存,然后尝试边缘。 Chrome正在吃你的错误。
查看请求,您应该有2个。 PREFLIGHT和请求本身。
如果预检(OPTIONS)失败,则甚至不会发出请求。
通常预检失败,因为服务器错误500.例外不包括cors标题,所以这可能是你的问题。
好的,现在,问题是Chrome赢了并且无法在任何地方显示错误。 因此,您可以检查EDGE上的请求,这将给您一个实际的错误(您必须使用开发人员控制台,错误不会在浏览器上显示)或使用fiddler。
既然你可以看到你的错误,你可能知道如何继续,但是要添加我自己面对的一点点:
如果你有services.AddMvc()
,这已经将cors添加到管道中,因此再次使用services.AddCors()
添加它会抛出已发现的密钥异常。 (我认为这是一个错误,可能会在github上提出问题)。
在使用AddMvc时配置cors你会这样做:
services.ConfigureCors(options =>
options.AddPolicy("AllowAll", p => p.AllowAnyOrigin()
.AllowAnyMethod()
.AllowCredentials()
.AllowAnyHeader()));
要将cors实际添加到管道中,您需要在Configure方法上执行app.UseCors("AllowAll");
。
如果您正在使用app.MapWhen
,请注意MapWhen分叉,因此您可能需要为MapWhen使用的所有分支指定UseCors,如需要cors,如api端点。 (如果您不知道我在这里谈论的内容,请忽略它。)