【问题标题】:Access to fetch at *** from origin *** has been blocked by CORS policy: No 'Access-Control-Allow-Origin'CORS 策略阻止了从 *** 从源 *** 获取的访问权限:没有“访问控制允许源”
【发布时间】:2023-03-24 18:01:01
【问题描述】:

我有错误

CORS 策略已阻止从源“http://localhost:3000”获取“http://localhost:5000/admin/authenticate”的访问权限:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

我的 ApiManager

function login(username, password) {
    const requestOptions = {
        method: 'POST',
        headers: {    
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*' },
        body: JSON.stringify({ username, password })};

    return fetch(`http://localhost:5000/admin/authenticate`, requestOptions)
        .then(handleResponse)
        .then(user => {
            // store user details and jwt token in local storage to keep user logged in between page refreshes
            localStorage.setItem('user', JSON.stringify(user));
            return user;
        }
    );
}

在后端 Asp.Net Core 2.2 (Startup.cs) 我写:

services.AddCors(options =>
{
    options.AddPolicy(
        _corsName,
        builder => { builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials(); });}
);

【问题讨论】:

  • AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials() 不是有效的 CORS 设置,请花时间阅读developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/…
  • 在客户端设置'Accept': 'application/json''Access-Control-Allow-Origin': '*' 标头的预期结果是什么?
  • 我相信您的代码只是注册了 CORS 服务,并没有启用它。我会参考documentation,看看你的代码有什么特别的不同。

标签: javascript c# asp.net reactjs api


【解决方案1】:

我尝试了 anerco 的答案,但它对我不起作用,我发现了这个 article,它有一个非常相似的解决方案,但添加了 .SetIsOriginAllowed(origin => true) 并删除了 .AllowAnyOrigin()

所以你应该将此代码添加到启动类中的配置方法中:

app.UseCors(x => x
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .SetIsOriginAllowed(origin => true) // allow any origin
                    .AllowCredentials()); // allow credentials

我建议阅读这篇文章以更好地理解所有这些内容,它非常简短且直截了当。

【讨论】:

    【解决方案2】:

    您好,我是这个主题的新手,但因为上周我遇到了这个错误,我尝试启用选项方法,第一部分已解决。 由于策略和安全问题而发生此错误,但现在我建议您获取状态代码,在我的情况下是 405 错误,这意味着现在我们必须更改请求中的标头以允许所有方法和来源(没办法) 但这对我没有帮助。

    所以我发现我已经在我的应用程序中为我的 API 启用了 cookie 加密和会话(很重要),因此我禁用了它们并清除了浏览器 cookie。

    所以尝试使用这些:

    1. 清除您的 cookie 并通过 Mod Header 扩展添加 Access-Control-Allow-Origin': '*' 并再次尝试检查修复。 mod header - your header (client)

    2. 尝试使用中间界面来控制你的请求并引导他们进入特殊规则

        app.use((req, res, next) => {
          res.header('Access-Control-Allow-Origin', '*');
          next();
        });
    

    根据本站:https://medium.com/@dtkatz/3-ways-to-fix-the-cors-error-and-how-access-control-allow-origin-works-d97d55946d9

    【讨论】:

      【解决方案3】:

      试试这个:

      on Startup.cs => Confirgure add:
           app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials());
      

      【讨论】:

        【解决方案4】:

        如果您的服务器是基于 express.js 的,请将这些行添加到服务器:

        app.use(function (req, res, next) {
           res.header("Access-Control-Allow-Origin", "*");
           res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
           next();
        })
        

        【讨论】:

          【解决方案5】:

          对于 NODE EXPRESS GRAPHQL RESTAPI 添加此标头中间件以避免 CORS 和任何 POST 或 OPTIONS 错误

          app.use((req, res, next) => {
                res.setHeader("Access-Control-Allow-Origin", "*");
                res.setHeader(
                  "Access-Control-Allow-Methods",
                  "OPTIONS, GET, POST, PUT, PATCH, DELETE"
                );
                res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
                if (req.method === "OPTIONS") {
                  return res.sendStatus(200);
                }
                next();
              });
          

          【讨论】:

            【解决方案6】:

            Chrome 中存在一个影响用户多年的错误,可以在here 找到它。

            您可以使用 Chrome 扩展 Allow-Control-Allow-Origin:* 可在此处找到:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi

            您也可以使用http://lacolhost.com/,它像本地主机一样指向 127.0.0.1。

            【讨论】:

            • 这完全是错误的和误导性的。你可以在 localhost 中使用 CORS 就好了
            • 奇怪,考虑到过去 18 个月我在 localhost 上的 Chrome 中使用了 CORS。
            • 这是由于bugs.chromium.org/p/chromium/issues/detail?id=67743这里发现的一个错误,我想这不会发生在每个人身上。
            猜你喜欢
            • 2021-11-03
            • 2021-08-07
            • 2021-12-24
            • 2021-07-20
            • 1970-01-01
            • 2020-10-07
            • 1970-01-01
            • 2019-04-11
            • 2019-12-18
            相关资源
            最近更新 更多