昨天我设法让我的 API 在我的本地计算机上工作,但是今天(相同的代码)在另一台计算机上,它不起作用,我在控制台上收到此错误:
无法加载http://localhost:52056/api/task: “Access-Control-Allow-Origin”标头的值为“null”,但不是 等于提供的原点。因此不允许原点“null” 访问。
这是 Chrome 上的 http 请求和响应:
(我在 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。 有什么想法吗? 谢谢
尝试删除
.AllowCredentials()
CORS 不允许您对同一策略拥有 .
AllowCredentials()
和 .AllowAnyOrigin()
。我不明白为什么它在不同的机器上工作。
这来自 ASP.NET 页面
CORS 规范还规定,在以下情况下将 origins 设置为“*”是无效的: 支持凭证是真的。
问题是您正在打开 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
我遇到了应用程序安全团队提出的类似问题。
问题是:“据观察,在应用程序中,当使用恶意 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");
这将删除
访问控制允许来源
来自响应标头的密钥。
希望这能解决您的问题。