来自 Vue 应用程序的发布请求被 CORS 策略阻止

Posted

技术标签:

【中文标题】来自 Vue 应用程序的发布请求被 CORS 策略阻止【英文标题】:Post request from Vue application blocked by CORS policy 【发布时间】:2020-08-15 02:34:25 【问题描述】:

我正在尝试从我的 Vue web 应用程序调用我的 C# web-api,但遇到以下错误:

Access to XMLHttpRequest at 'http://www.api.example.com/' 
from origin 'http://www.example.com' has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

以下代码 sn-p 显示了我如何使用 axios 调用 rest-api。

import axios from 'axios'

const client = axios.create(
    baseURL: 'http://www.api.example.com',
    json: true,
    withCredentials: true
)

export default 
    async execute(method, resource, data) 
        return client(
            method,
            url: resource,
            data,
            headers: 
        ).then(req => 
            return req
        )
    ,

    myFunc(data) 
        return this.execute('post', '/', data)
    


带有POST请求方式的web-api如下:

[EnableCors("VueCorsPolicy")]
[Route("api/[controller]")]
[ApiController]
public class MyController : ControllerBase

   [HttpPost]
   public async Task<int> Post([FromBody] Data data)
   
       // stuff
   

我还在 Startup.cs 文件中的“ConfigureServices”方法中添加了一个 CORS。

services.AddCors(options =>

    options.AddPolicy("VueCorsPolicy", builder =>
    
       builder
       .WithOrigins("http://www.example.com")
       .AllowAnyHeader()
       .AllowAnyMethod()
       .AllowCredentials();
    );
);

最后我还在 Startup.cs 文件中添加了“配置”方法:

app.UseCors("VueCorsPolicy");

【问题讨论】:

【参考方案1】:

CORS 是一种安全机制,无法通过简单地修改代码来克服。必须设置服务器,以便它允许来自您的源的请求 - 因此,如果您控制服务器,您就可以做到。

但是,有一些解决方案可以在开发阶段为您提供帮助,例如 cors-anywhere.herokuapp.com

您应该在代码中的 baseURL 之前添加它,如下所示:

baseURL: 'https://cors-anywhere.herokuapp.com/http://www.api.example.com'.

这不是生产解决方案,仅用于开发。

您可以托管自己的 cors-anywhere 应用程序,更多信息:https://www.npmjs.com/package/cors-anywhere

【讨论】:

作为自己的API问题的代理是极其不安全的,绝对建议去修改后端,这个答案(恕我直言)是越轨的,请删除 .WithOrigins("http://www.thomasleoblok.dk/") 这是你的问题所在,它应该是.WithOrigins("http://www.example.com"),因为它是example.com 你想允许发出请求,你想允许任何你可以改变它的网站.WithOrigins("*")【参考方案2】:

.WithOrigins("http://www.thomasleoblok.dk/")这是你的问题所在,它应该是.WithOrigins("http://www.example.com"),因为它是你想要允许发出请求的example.com,你想要允许任何网站你可以将它更改为.WithOrigins("*")

【讨论】:

首先我尝试更改特定的网址,但遗憾的是它没有用。然后我尝试将其更改为.WithOrigins("*"),但仍然出现相同的错误。 .WithOrigins("*") 时,您不包括此 .AllowCredentials(),因为如果 Access-Control-Allow-Credentials 标头存在,则将来源设置为“*”(所有来源)无效。阅读更多来自here 你使用的是哪个版本的 asp .net core @Thomas Leo Blok 我使用.net core 3.1 我上一次用asp .net core是2.2的时候,我查3.1的文档看看【参考方案3】:

如果您在本地尝试,则必须打开源 localhost,否则 BE 将始终返回 cors 错误为 localhost != http://www.thomasleoblok.dk/

为了测试我建议你启用 AllowAnyOrigin() 示例:

services.AddCors(options =>

    options.AddPolicy("VueCorsPolicy", builder =>
    
       builder
       .AllowAnyOrigin()
       .AllowAnyHeader()
       .AllowAnyMethod()
       .AllowCredentials();
    );
);

【讨论】:

以上是关于来自 Vue 应用程序的发布请求被 CORS 策略阻止的主要内容,如果未能解决你的问题,请参考以下文章

Google App Script Web App GET 和 POST 请求被 CORS 策略阻止

角 POST 请求被 CORS 策略阻止:对预检请求的响应未通过访问控制检查

在 ajax 发布请求中,我的应用被 CORS 策略错误阻止

来自除 localhost 之外的每个来源的 CORS 策略阻止的对外部 API 的 HTTP 请求

被 CORS 策略阻止 - 来自 Django 应用程序的 S3 存储桶访问

http 请求被 Flutter Web 的 Cors 策略阻止