CORS asp.net 核心 webapi - 缺少 Access-Control-Allow-Origin 标头

Posted

技术标签:

【中文标题】CORS asp.net 核心 webapi - 缺少 Access-Control-Allow-Origin 标头【英文标题】:CORS asp.net core webapi - missing Access-Control-Allow-Origin header 【发布时间】:2019-10-03 11:41:24 【问题描述】:

我有启用 CORS 的 ASP.net WebApi Core。它是 Visual Studio ASP.net Core Web API 模板。添加的唯一代码是支持 CORS 的代码:

public void ConfigureServices(IServiceCollection services)
        
            services.Configure<CookiePolicyOptions>(options =>
            
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            );

            services.AddCors();

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    
       /*  other stuff   */

        app.UseCors(builder => builder
            .WithOrigins("https://localhost:44310")
            .AllowAnyMethod()
            .AllowAnyHeader());

        app.UseMvc();
    
        

我的 API 托管在 localhost:44361 和 mycalling WEB 上 localhost:44310。有不同的端口,所以我的请求来自不同的来源。这就是为什么应该有标题 Access-Control-Allow-Origin 作为响应。它丢失了,我在浏览器控制台中看到错误:

Access to fetch at 'https://localhost:44361/api/values' 
from origin 'https://localhost:44310' has been blocked by CORS policy: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.
If an opaque response serves your needs, set the request's mode to 'no-cors'
to fetch the resource with CORS disabled.

问题出在哪里?

请求标头:

GET https://localhost:44361/api/values HTTP/1.1
Host: localhost:44361
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Origin: https://localhost:44310
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/74.0.3729.131 Safari/537.36
Accept: */*
Referer: https://localhost:44310/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

响应标头:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/10.0
X-SourceFiles: =?UTF-8?B?RDpcRGV2ZWxvcG1lbnRcQyNfcHJvZ3JhbW1pbmdcU0FNUExFU1xDb3JzQXBpU2ltdWxhdG9yXENvcmVBcGlcYXBpXHZhbHVlcw==?=
X-Powered-By: ASP.NET
Date: Thu, 16 May 2019 08:37:54 GMT

【问题讨论】:

问题中的所有内容对我来说都不错。你能把它变成minimal reproducible example吗? .AllowAnyOrigin() 也会发生这种情况吗? 是的,结果相同。 这是一个异常值,但会增加我最近的经验。就我而言,我添加了访问 API 资源的 MFA 要求。 API 抛出 401 但此错误清除了标头...因此不存在任何 Access-Control-Allow-Origin 标头。关键是在对 CORS 进行故障排除之前确保您的请求中没有错误 【参考方案1】:

你可以试试这个吗,

  services.AddCors(options =>
        
            options.AddPolicy("CorsPolicy",
                builder => builder
                    .AllowAnyMethod()
                    .AllowCredentials()
                    .SetIsOriginAllowed((host) => true)
                    .AllowAnyHeader());
        );

并使用它

app.UseCors("CorsPolicy");

此代码适用于任何来源。我只是有类似的东西,当我直接在 app.UseCors() 中使用 cors 时我遇到了问题,然后我尝试了这个并且它起作用了。 ps 不要在 app.UseMvc() 之后使用 app.UseCors()

【讨论】:

将主机设置为 true 意味着它将允许任何浏览器访问该主机。要限制这一点,请将 (host) =&gt; true 替换为 (host) =&gt; return host == "my.domain.com"; 以仅允许您信任的域。【参考方案2】:

这可能是由于服务器端错误,在这种情况下响应标头被清除,CORS 响应标头也被清除。尝试启用异常并调试您的应用程序以查找错误。

另请参阅:asp net core - No 'Access-Control-Allow-Origin' header is present on the requested resource。

【讨论】:

我没有深入挖掘日志,但我的 API 只是 Visual Studio 生成的纯 web api 项目,没有额外的代码(除了提到的 CORS)。响应码是 200。我不认为是因为错误。【参考方案3】:

如果您有这种情况,可能会发生

app.UseHttpsRedirection();

Startup.Configure 中,并且您的开发 https 证书不受浏览器信任。对 http 端点的调用将重定向到 https,这将失败并返回一个抱怨 CORS 标头的错误。

调试非常令人沮丧。为那个人浪费了一个早晨。

【讨论】:

以上是关于CORS asp.net 核心 webapi - 缺少 Access-Control-Allow-Origin 标头的主要内容,如果未能解决你的问题,请参考以下文章

azure 应用服务和 asp.net 核心:CORS 策略甚至 AllowAnyOrigin 也阻止了来源

Asp.Net Core WebAPI CORS 不工作

如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS

ASP.NET WebApi - 为多个来源启用 CORS

Blazor 无法连接到 ASP.NET Core WebApi (CORS)

在 ASP.Net Core 5 WebAPI 中启用 CORS