【问题标题】:Asp.Net5 EnableCors not workingAsp.Net 5 启用 Cors 不起作用
【发布时间】:2015-10-15 10:31:40
【问题描述】:

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

但是,如果我删除了授权属性:

    [EnableCors("AllowAll")]
    public class MyController

那我就被允许了……这是怎么回事?

【问题讨论】:

  • 你是如何解决这个问题的?
  • 很遗憾,我没有

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


【解决方案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 等内容,而不仅仅是控制器操作提供的资源。

【讨论】:

    【解决方案2】:

    首先,清除 chrome 上的缓存,然后在 edge 中尝试。 Chrome 正在吃掉你的错误。

    查看请求,您应该有 2 个。 PREFLIGHT 和请求本身。

    如果预检 (OPTIONS) 失败,则甚至不会发出请求。

    通常预检失败是因为服务器错误 500。异常不包括 cors 标头,所以这可能是您的问题。

    好的,现在,问题是 chrome 不会在任何地方显示错误。 所以,你可以在 EDGE 上检查请求,这会给你一个实际的错误(你必须使用开发者控制台,错误不会显示在浏览器上)或使用 fiddler。

    现在您可以看到您的错误,您可能知道如何继续,但是添加一点我自己遇到的问题:

    1. 如果您有 services.AddMvc(),这已经将 cors 添加到管道中,因此再次使用 services.AddCors() 添加它会引发 key already found 异常。 (我认为这是一个错误,可以在 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 需要 cors 的所有分支指定 UseCors,例如您的 api 端点。 (如果你不知道我在说什么,请忽略它。)

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 2016-01-22
      • 2021-04-09
      • 2016-01-06
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 2017-04-19
      • 2019-12-01
      相关资源
      最近更新 更多