ASP.NET Core Web Api 发送 Access-Control-Allow-Origin: null CORS header 和 chrome 出错,如何修复?

问题描述 投票:0回答:3

昨天我设法让我的 API 在我的本地计算机上工作,但是今天(相同的代码)在另一台计算机上,它不起作用,我在控制台上收到此错误:

无法加载http://localhost:52056/api/task: “Access-Control-Allow-Origin”标头的值为“null”,但不是 等于提供的原点。因此不允许原点“null” 访问。

这是 Chrome 上的 http 请求和响应:

enter image description here

(我在 IE/Firefox 中没有看到错误)

这是我的启动类(使用.net core 2)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using TodoApi;

namespace TestCors
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<ITaskWarehouse, TaskWarehouse>();

            services.AddCors();
            services.AddMvc();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

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

这里出了什么问题? 代码与昨天相同,但我在 Windows 10 上运行,而这台机器有 Windows 7。 有什么想法吗? 谢谢

c# .net asp.net-core cors asp.net-core-webapi
3个回答
8
投票

尝试删除

.AllowCredentials()

CORS 不允许您对同一策略拥有 .

AllowCredentials()
.AllowAnyOrigin()
。我不明白为什么它在不同的机器上工作。

这来自 ASP.NET 页面

CORS 规范还规定,在以下情况下将 origins 设置为“*”是无效的: 支持凭证是真的。


2
投票

问题是您正在打开 html 页面,只需双击它即可发出此请求,而不使用服务器。所以浏览器中的 url 是“file:///...”。这意味着没有来源,正如您在问题的屏幕截图中看到的那样 - CORS 请求具有“Origin: null”标头。不同的浏览器以不同的方式处理这种情况。 Chrome 会限制来自此类来源的跨域请求,即使响应允许(通过返回“null”作为“Access-Control-Allow-Origin”)。

因此要修复 - 使用适当的服务器(本地服务器),或使用其他浏览器进行开发。也有人声称像这样启动 chrome

chrome.exe --allow-file-access-from-files

也应该“解决”这个问题,尽管我自己没有尝试过。

更新:我的印象是,即使使用

Access-Control-Allow-Origin: *
chrome 也不允许这样做,但您对其他答案的评论似乎另有主张(通过删除
AllowCredentials()
您做出了回应,使用“*”作为允许的来源而不是提供的来源根据要求)。如果是这样 - 这是修复它的另一种方法(不确定,也许它在不同的 chrome 版本中表现不同)。


0
投票

0

我遇到了应用程序安全团队提出的类似问题。

问题是:“据观察,在应用程序中,当使用恶意 url 操纵源时,它会反映在响应标头中,即 Access-control-Allow-Origin 反映了恶意 url,这意味着该域可以访问以下资源:易受攻击的域。”

为了解决此问题,对 cors 政策进行了以下更改:

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowSpecificOrigin",
           builder => builder
           .AllowAnyMethod()
           .AllowAnyHeader()
           //.AllowCredentials()
           //.SetIsOriginAllowed(hostName => true)
           .WithOrigins("https://localhost:443/"));
});




app.UseCors("AllowSpecificOrigin");

这将删除

访问控制允许来源

来自响应标头的密钥。

希望这能解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.