【问题标题】:ASP.NET 5/Core/vNext CORS not working even if allowing pretty much everything即使允许几乎所有内容,ASP.NET 5/Core/vNext CORS 也无法正常工作
【发布时间】:2016-09-05 09:53:27
【问题描述】:

我有一个 ASP.NET 5 Web API(好吧,无论如何现在都是 MVC)后端,我正在使用我的 JS 应用程序中的 axios 库。

我在 MVC 中的 CORS 配置如下:

public void ConfigureServices(IServiceCollection services)
{
      services.AddMvc();
      services.AddCors();
} 


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{ 
      app.UseCors(builder => {
          builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
      });
}

也就是说,我应该允许所有可能的请求。然而,虽然这个修复了预检请求,但 POST 请求仍然被拒绝(我可以看到它在服务器上执行,但响应中没有标头,因此会导致客户端错误)。

有没有人知道为什么这不起作用?

这些是 MVC api 返回的标头:

  • 对于 OPTIONS 预检(这一项通过):
  • 对于实际的 POST 请求(这个没有通过):

【问题讨论】:

  • 请确保您的客户端将原始标头发送到您的服务器,并且您的服务器接收到原始标头,如果没有原始标头,则 cors 中间件将无法工作。而且如果使用这种方式配置cors,就不需要将cors添加到服务集合中。
  • 我刚刚再次检查了请求,它们都在发送原始标头。
  • 当您使用 post 请求时,您能否说明服务器是否收到了 origin 标头?此外,cors 中间件将始终拦截选项请求。你能告诉我cors的版本吗? RC1 在我的应用程序中正常工作。
  • 只需使用调试查看HttpContext.Request.Headers's Results View 或打印HttpContext.Request.Headers["Origin"] 以检查标题字段
  • 发生异常时,默认的异常处理程序会清除所有响应头,包括cors头。

标签: c# asp.net-core cors


【解决方案1】:

你必须在 MVC 之前添加 Cors。中间件的注册顺序很重要。如果 Cors 在 mvc 之后注册,它将永远不会被调用。它们按注册顺序调用。

一旦 cors 处理了请求,它将把它传递给下一个中间件 (Mvc)

【讨论】:

  • 我更改了订单,但没有任何区别。 OPTIONS 预检仍然通过,并且以下 POST 请求抛出“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”像之前一样。我将我收到的回复添加到原始帖子中。
  • 如果有帮助,我在配置中的“使用”调用顺序如下:app.UseCorsapp.UseJwtBearerAuthenticationapp.UseIISPlatformHandlerapp.UseStaticFilesapp.UseMvc
【解决方案2】:

@Norgerman 在 cmets 中提到了这一点,但我认为这是值得回答的,因为我自己犯了这个错误几次次:

CORS 中间件仅适用于实际的跨域请求

如果您只是访问相同的域请求(例如在浏览器中输入 URL),它不会被触发。

这意味着,如果您正在测试,您必须使用来自另一个端口或域上的 XHR 客户端的实际跨域请求,或者使用可以显式地将 origin 标头插入 HTTP 请求的 HTTP 客户端。

【讨论】:

  • 我发现只有在不通过 IIS express 运行时才会出现这种情况。这给我带来了很多困惑,因为在 IIS express 中调试时存在 CORS 标头,但在运行纯 kestrel 时不存在。
【解决方案3】:

问题实际上在于处理 POST 请求的操作中存在异常,正如 Norgerman 所提到的,默认异常处理程序清除了 CORS 标头。

【讨论】:

  • github 上有一个与此相关的广泛线程。如果您点击链接,则该问题已在 2.2 中得到修复,并且故障将不再导致 CORS 不发送标头,但我尚未对其进行测试。
  • 更新了@Jordan 发布的链接github.com/dotnet/aspnetcore/issues/2378
【解决方案4】:

这对我有用:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{ 
    app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials());
}

【讨论】:

  • 当您选择具体说明来源时,您还需要包括方案,即包括 'http://' 例如builder.WithOrigins("http://localhost:52286")
  • 您永远不应该将AllowAnyOrigin()AllowCredentials() 一起使用。改为使用带有凭据的特定来源。
  • 从 ASP.NET Core 2.2 开始,您不能AllowAnyOrigin()AllowCredentials() 一起使用:trailheadtechnology.com/… 相关 GitHub 问题:github.com/dotnet/aspnetcore/issues/3106
  • 是的,它适用于 .Net Core 1.1
【解决方案5】:

如果您使用的是 UseHttpsRedirection,请确保您的应用正在调用 https URL 而不是 http URL,否则即使返回 Accept-Header-Allow-Origin 标头,您也会收到 CORS 错误。

【讨论】:

  • 感谢您的建议。看到这个后,我从 api 模板中评论了我的行,最后 cors 工作了。现在我知道在哪里继续调查以使我的小项目运行起来
【解决方案6】:

假设您正在尝试创建一个真正的 PUBLIC 端点,这对我有用:

请确保:

app.UseCors(builder => {
    builder.AllowAnyOrigin()
    builder.AllowAnyMethod()
    builder.AllowAnyHeader()
});

在以下任何一个之前发生:

app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseCookiePolicy();

app.useMvc();

请记住,我们正在处理“管道”。 cors 的东西必须放在第一位。

另外 - (我再次假设,“公共端点”) - 确保您的 XHR 调用具有... xhr.withCredentials = false;

... 或者只是省略它。如果您将其设置为“true”,您将收到有关“通配符”的 CORS 警告。

【讨论】:

    【解决方案7】:

    这对我有用,因为我在使用 CORS 和 axios 时遇到了同样的问题。

    假设您已正确设置 API,并且已在 API 控制器中修饰了类:

    [EnableCors("YourCorsPolicy")]
    

    (您还需要将“使用 Microsoft.AspNetCore.Cors;”语句添加到您的课程中)

    那么你需要在你的 axios-auth.js 文件中使用以下内容:

    axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'
    

    这对我来说在 https 上工作得很好。如果您需要指南,这是我完整的 axios-auth。

    import axios from 'axios'
    
    const instance = axios.create({
      baseURL: 'https://localhost:56799/api'
    })
    
    axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'
    axios.defaults.headers.get['Accepts'] = 'application/json'
    axios.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8'
    
    export default instance
    

    我希望这是有用的。

    【讨论】:

      【解决方案8】:

      对我有帮助:

      services.AddCors(options =>{
        options.AddPolicy(AllowAllCorsPolicy, builder =>{
          builder
          .SetIsOriginAllowed(x =>_ = true)
          .AllowAnyMethod()
          .AllowAnyHeader()
          .AllowCredentials();
        });
      });
      

      拍摄from

      【讨论】:

        【解决方案9】:

        请注意,除了在您的项目中启用 CORS 之外,还必须正确设置 Windows 防火墙和项目的 .vs\config\applicationhost.config。下面的清单可以提供帮助:

        1. 您的应用程序/API 使用的端口是否在防火墙中打开?如果没有,请打开它。

        2. 打开您的项目.vs\config\applicationhost.config 文件并搜索<binding protocol="http" bindingInformation="*:NNNNN:localhost" />(其中NNNNN 是您的应用程序/API 使用的IP 端口号)。在此之后添加第二行 <binding protocol="http" bindingInformation="*:NNNNN:*" />,以便您允许任何 IP 地址访问您的应用程序。

        重新启动 IIS Express 并记住在大多数情况下以管理员身份运行 Visual Studio 很重要。

        之后,继续您的 CORS 设置和测试。

        【讨论】:

        • 这只是让应用程序在 2 个不同的端口上运行。进而导致第二个站点无法连接到端口,因为它已经在使用中。
        猜你喜欢
        • 2016-08-21
        • 2020-04-18
        • 2020-10-07
        • 2018-06-23
        • 2021-06-30
        • 2011-08-28
        • 2016-09-27
        • 1970-01-01
        • 2019-03-15
        相关资源
        最近更新 更多