被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权

Posted

技术标签:

【中文标题】被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权【英文标题】:blocked by CORS policy: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response 【发布时间】:2019-09-16 02:32:07 【问题描述】:

我有一个网站 1 和一个 Web API 2 我的 Web API 有一个方法名称

 public string Index()
        
            return "Hello world from site 2";
         

在控制器值中。 我像这样从网站 1 调用我的 API

$.ajax(
            url: relativeUrl,
            headers:  "Authorization": "Bearer " + accessToken ,
            type: "GET"
        )
            .done(function (result) 
                console.log("Result: " + result);
                alert(result);
            )
            .fail(function (result) 
                console.log("Error: " + result.statusText);
                alert(result.statusText);
            );

但我的 js 控制台出现以下错误。

从源“网站 1”访问“Web API 2”的 XMLHttpRequest 已 被 CORS 策略阻止:请求标头字段授权不是 Access-Control-Allow-Headers 在预检响应中允许。

我在我的控制器中添加:

[EnableCors(origins: "*", headers: "*", methods: "*", exposedHeaders: "X-Custom-Header")]

在我的 WebAPIConfig.cs 中

config.EnableCors();

在我的 Web.config 中

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  </customHeaders>
</httpProtocol>

但即使这样我仍然有错误,我不明白我需要添加什么以及在哪里。

【问题讨论】:

您是否在localhost 上同时运行网站和API? 【参考方案1】:

你有

<add name="Access-Control-Allow-Headers" value="Content-Type" />

headers:  "Authorization": "Bearer " + accessToken ,

换句话说,Access-Control 设置只允许“content-type”标头,但您的请求发送的是“Authorization”标头。很明显,这两件事不匹配。

错误非常清楚地告诉您 Access-Control-Allow-Headers 响应标头不允许“授权”请求标头。

试试

<add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" />

改为。

附:我认为您不需要同时使用 web.config 设置 EnableCors 操作过滤器。我认为您在此处的 EnableCors 声明是多余的。请参阅https://***.com/a/29972098/5947043 了解更多信息。

更多信息请见https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers

【讨论】:

那是真的。我没有专注于令牌,因为它是空的,所以我没有看到它在我面前是什么。谢谢,现在可以正常工作了。【参考方案2】:

我不知道这个,但我在 Node.js 中遇到了同样的问题。 我想如果你改变这个

<add name="Access-Control-Allow-Headers" value="Content-Type" />

<add name="Access-Control-Allow-Headers" value="*" />

<add name="Access-Control-Allow-Headers" value="Authorization" />

因为您正在调用 Authorization 标头。

【讨论】:

是的,将 value 更改为 value="*" 也为我修复了它 很高兴听到我能够帮助您! ? 正确! (无服务器)Cloudflare Workers CORS 也需要特殊值 Authorization,而不仅仅是通用 node.js 传统应用程序。

以上是关于被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权的主要内容,如果未能解决你的问题,请参考以下文章

JAX-RX - 被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Methods 不允许方法 PATCH

Laravel 7 CORS:被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”

被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头

被 CORS 阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权

从源 xxxx 访问 XMLHttpRequest ' 被 CORS 策略阻止:对预检的响应。预检请求不允许重定向

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