Asp.Net5 EnableCors无法正常工作

时间:2015-10-13 20:44:44

标签: asp.net cors asp.net-core-mvc

我的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

然后我被允许......发生了什么事?

2 个答案:

答案 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。

既然你可以看到你的错误,你可能知道如何继续,但是要添加我自己面对的一点点:

  1. 如果你有services.AddMvc(),这已经将cors添加到管道中,因此再次使用services.AddCors()添加它会抛出已发现的密钥异常。 (我认为这是一个错误,可能会在github上提出问题)。

  2. 在使用AddMvc时配置cors你会这样做:

    services.ConfigureCors(options =>
                        options.AddPolicy("AllowAll", p => p.AllowAnyOrigin()
                                                            .AllowAnyMethod()
                                                            .AllowCredentials()
                                                            .AllowAnyHeader()));
    
  3. 要将cors实际添加到管道中,您需要在Configure方法上执行app.UseCors("AllowAll");

  4. 如果您正在使用app.MapWhen,请注意MapWhen分叉,因此您可能需要为MapWhen使用的所有分支指定UseCors,如需要cors,如api端点。 (如果您不知道我在这里谈论的内容,请忽略它。)