【问题标题】:CORS request being rejected despite correct headers尽管标头正确,但 CORS 请求仍被拒绝
【发布时间】:2019-02-25 21:47:35
【问题描述】:

在我的 ASP.Net Core 2.2 设置中,我有一种方法可以创建“允许所有”CORS 策略

public static IServiceCollection AddAllowAllCors(this IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowAll", builder =>
        {
            builder.AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials()
                    .SetIsOriginAllowed(_ => true);

        });
    });
    return services;
}

ConfigureServices中添加的:

public void ConfigureServices(IServiceCollection services)
{
...
    services.AddAllowAllCors();
...
}

我在 Configure 方法中激活的:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseCors("AllowAll");
    ...
}

当我尝试从我的 React 应用发出 PUT 请求时,Chrome 中的 OPTIONS 请求如下所示:

但实际的 PUT 请求失败并返回 405:

尽管允许 OPTIONS 响应中的 Access-Control-Allow-Origin 标头是允许的。这在 2.1 中有效,但在 2.2 中无效。确切的错误信息是:

访问“MY_REQUEST_URI”已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

我也尝试在策略中删除 AllowCredentials(),但这并没有什么不同。

【问题讨论】:

  • 我认为默认情况下错误消息不会附加 CORS 策略。因此,CORS 错误只是它似乎认为没有处理程序可以处理对该端点的 PUT 请求的事实。任何机会将其设置为 [HttpPost] 而不是 [HttpPut]
  • 看起来 ASP.net 核心将响应带有 Access-Control-Allow-Methods 的 OPTIONS 请求,无论 Access-Control-Request-Method 标头设置为什么,无论是否有处理程序因为那个特定的方法确实存在
  • 我刚刚使用OPTIONS 和Access-Control-Request-Method: INVALID_METHOD 对其进行了测试,选项请求返回为204,Access-Control-Allow-Methods: INVALID_METHOD
  • 您可以将 .Build() 添加到构建器的末尾,然后再试一次吗?
  • 您能否为此提供minimal reproducible example?

标签: c# asp.net-core .net-core asp.net-core-2.2


【解决方案1】:

看起来您的 CORS 配置没问题。但是没有实际的 PUT 处理程序。您应该首先使用某种休息客户端(例如邮递员或 ARC)检查您的 API,然后再考虑 CORS。

【讨论】:

  • CORS 处理程序是什么意思?我有一个处理 PUT 请求的控制器。正如我在问题中提到的那样,在升级到 netcore2.2 之前,这与 PUT 请求一起工作正常
【解决方案2】:

关闭新的Endpoint Routing 功能和disabling the WebDav module in IIS 的组合为我解决了这个问题。我相信由于 Endpoint Routing,我的预检请求实际上是由 WebDav 模块而不是我的应用程序处理的。

要关闭端点路由,请在.AddMvc() 中将标志设置为false:

services.AddMvc(options =>
    {
        ...other options
        options.EnableEndpointRouting = false;
    })

【讨论】:

    【解决方案3】:
    public static IServiceCollection AddAllowAllCors(this IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("AllowAll", builder =>
            {
                builder.AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowCredentials()
                        .AllowAnyOrigin();
    
            });
        });
        return services;
    }
    

    【讨论】:

    • 在 ASP.Net Core 2.2 中不再允许同时使用 AllowAnyOrigin 和 AllowCredentials:CORS docs
    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2023-03-14
    • 2017-01-14
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多