ASP.NET Core 2.2 CORS 没有“Access-Control-Allow-Origin”标头 [关闭]

Posted

技术标签:

【中文标题】ASP.NET Core 2.2 CORS 没有“Access-Control-Allow-Origin”标头 [关闭]【英文标题】:ASP.NET Core 2.2 CORS No 'Access-Control-Allow-Origin' header [closed] 【发布时间】:2020-08-30 23:55:24 【问题描述】:

我无法使用 ASP.NET Core 2.2 Web api。

下面这段 javascript 代码运行良好,我可以让所有客户端都正常

fetch('https://10.20.0.20:8081/api/clients/list').then(data =>  data.json().then(dt=>console.log(dt)) ).catch(error =>  console.log(error));

但是这个不行

fetch('https://10.20.0.20:8081/api/clients/list', "headers": "content-type": "application/json").then(data =>  data.json().then(dt=>console.log(dt)) ).catch(error =>  console.log(error));

嗯...这就是我在 Startup.cs 的 ConfigureServices 方法中所拥有的

services.AddCors(setup => setup.AddPolicy("AllowAll", builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials()));

我在 Startup.cs 中配置方法之后的第一行

app.UseCors("AllowAll");

当我在上面评论这行时,两个 fetch 都停止工作了。

我做了这个小测试,只是因为我使用 angular 来使用这个 API,我遇到了同样的问题。

错误信息:

从源“https://10.20.0.20:8080”获取“https://10.20.0.20:8081/api/clients/Listar”的访问权限已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头出现在请求的资源上。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

我在另一个工作的 IIS 中有相同的应用程序/代码。我猜这是 IIS 的问题


编辑 -> 2020-05-16

我做了一个中间件来检查所有带有 context.Request.Method 的请求方法。 在我的本地机器上,我得到了 GET 和 OPTIONS 方法,但在这个服务器上,我只得到了 GET。我想问题出在这台服务器上。

【问题讨论】:

.WithExposedHeaders("content-type") - 尝试将其添加到 CORS 构建器 .WithExposedHeaders("content-type") 不起作用 在 IIS 中,需要添加 OPTIONS 方法。默认情况下 OPTIONS 不可用。 是的...@user13422309 我在上周六弄明白了,因为我穿上了我的 EDIT -> 2020-05-16。有人将 OPTIONS 动词设为假 :( 【参考方案1】:

这就是我在 Startup.cs 的 ConfigureServices 方法中所拥有的

services.AddCors(setup => setup.AddPolicy("AllowAll", builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials()));

在您的代码中,我们发现您同时配置了AllowAnyOriginAllowCredentials这两个方法,这会导致CORS服务返回无效的CORS响应。

请修改您的代码以启用特定来源,如下所示。

services.AddCors(setup => 
    setup.AddPolicy("AllowAll", builder => 
        builder.WithOrigins("https://10.20.0.20:8080")
        .AllowAnyHeader()
        .AllowAnyMethod()
        .AllowCredentials())
    );

我在另一个运行的 IIS 中有相同的应用程序/代码。我猜这是 IIS 的问题

请检查您是否为您的 IIS 站点启用了 Windows 身份验证,您可以尝试为您的站点安装 IIS CORS module 并进行配置。

【讨论】:

它没有用。我在另一个 IIS 工作中有相同的应用程序/代码。我猜这是 IIS 的问题 嗨@ProgramadorDesenvolvedor,您可以尝试安装IIS CORS 模块,该模块为IIS 服务器提供正确响应预检请求的方法。有关 IIS 中 CORS 的更多信息,请查看我上面的更新。【参考方案2】:

有人在 Request Filtering -> HTTP Verbs on IIS 中将 OPTIONS 设置为 false

【讨论】:

以上是关于ASP.NET Core 2.2 CORS 没有“Access-Control-Allow-Origin”标头 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章