来自 CORS 预检通道的 CORS header 'Access-Control-Allow-Headers' 中缺少令牌 'access-control-allow-headers'
Missing token 'access-control-allow-headers' in CORS header 'Access-Control-Allow-Headers' from CORS preflight channel
我有两个 VS 项目:一个公开 MVC5 控制器,另一个是 angular 客户端。我希望 angular 客户端能够查询控制器。
我阅读了许多主题并尝试了以下内容:
我在服务器的网络配置中添加了这个:
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
<system.webServer>
我在控制器的操作中创建并使用了以下过滤器:
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
base.OnActionExecuting(filterContext);
}
}
在 angular 客户端中,我创建了以下拦截器:
app.factory("CORSInterceptor", [
function()
{
return {
request: function(config)
{
config.headers["Access-Control-Allow-Origin"] = "*";
config.headers["Access-Control-Allow-Methods"] = "GET, POST, OPTIONS";
config.headers["Access-Control-Allow-Headers"] = "Content-Type";
config.headers["Access-Control-Request-Headers"] = "X-Requested-With, accept, content-type";
return config;
}
};
}
]);
app.config(["$httpProvider", function ($httpProvider) {
$httpProvider.interceptors.push("CORSInterceptor");
}]);
根据 Firebug,这导致以下请求:
OPTIONS //Login/Connect HTTP/1.1
Host: localhost:49815
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://localhost:50739
Access-Control-Request-Method: POST
Access-Control-Request-Headers: access-control-allow-headers,access-control-allow-origin,content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
以及以下响应:
HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/10.0
Public: OPTIONS, TRACE, GET, HEAD, POST
X-SourceFiles: =?UTF-8?B?RDpcVEZTXElVV2ViXEdhcE5ldFNlcnZlclxBU1BTZXJ2aWNlc1xMb2dpblxDb25uZWN0?=
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: *
Access-Control-Request-Headers: X-Requested-With, accept, content-type
Date: Tue, 01 Sep 2015 13:05:23 GMT
Content-Length: 0
Firefox 仍然阻止请求并显示以下消息:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:49815//Login/Connect. (Reason: missing token 'access-control-allow-headers' in CORS header 'Access-Control-Allow-Headers' from CORS preflight channel).
问题是,某些浏览器还不允许 Access-Control-Allow-Headers
的 *
通配符。具体来说,Firefox 69 及更早版本不会。参见 https://bugzilla.mozilla.org/show_bug.cgi?id=1309358。
因此,为确保您在所有浏览器中获得正确的行为,您发送回的 Access-Control-Allow-Headers
值应明确列出您实际需要从前端代码访问的所有 header 名称;例如,在问题的情况下:Access-Control-Allow-Headers: Content-Type
.
无需对所有 header 名称进行硬编码即可实现这一点的方法是:让您的 server-side 代码采用 Access-Control-Request-Headers
请求 header 的值浏览器发送,并将其回显到 Access-Control-Allow-Headers
响应的值中 header 您的服务器发回。
或者使用一些现有的库 CORS-enable 您的服务器。将 Access-Control-Request-Headers
request-header 值回显到 Access-Control-Allow-Headers
response-header 值是大多数 CORS 库通常会为您做的事情。
通常,我阅读的线程会建议几个不必要的配置步骤,这会造成混乱。其实很简单...
出于简单的目的,从 angular 客户端向 ASP 控制器发送跨站点请求:
- 不需要 angular 拦截器。
- 不需要服务器端的自定义过滤器。
唯一的强制修改是在服务器的web.config
中添加这个
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
</customHeaders>
</httpProtocol>
</system.webServer>
我在我的 .net c# mvc 应用程序和 angular 8 中的客户端应用程序中进行了尝试,但它无法正常工作。在 web.config 中,我添加了
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="http://localhost:4200" />
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
</customHeaders>
</httpProtocol>
我还在 global.axax.cs 文件中添加了
void MvcApplication_AuthenticateRequest(object sender, EventArgs e)
{
Context.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
}
但它不起作用。在 chrome 中响应 header 它确实显示为:
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Origin: http://localhost:4200
Access-Control-Allow-Origin: http://localhost:4200
但在请求中 header 它显示为
Access-Control-Request-Headers: access-control-allow-origin,content-type,x-iphoneclientid
而它需要像
x-iphoneclientid : 8E72FF50-548B
因为 x-iphoneclientid 是我在过滤器 class 中验证的令牌
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
if (request == null || request.RequestUri == null)
{
return null;
}
// Write your Authentication code here
IEnumerable<string> monsterApiKeyHeaderValues = null;
// Checking the Header values
if (request.Headers.TryGetValues("x-iphoneclientid", out monsterApiKeyHeaderValues))
以上条件未找到,因此拒绝它并且未到达控制器。
我什至在我的控制器中添加了以下内容
[EnableCors("", "", "*")]
请指导一下
谢谢
我有两个 VS 项目:一个公开 MVC5 控制器,另一个是 angular 客户端。我希望 angular 客户端能够查询控制器。 我阅读了许多主题并尝试了以下内容:
我在服务器的网络配置中添加了这个:
<system.webServer> <httpProtocol> <customHeaders> <clear /> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol> <system.webServer>
我在控制器的操作中创建并使用了以下过滤器:
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*"); base.OnActionExecuting(filterContext); } }
在 angular 客户端中,我创建了以下拦截器:
app.factory("CORSInterceptor", [ function() { return { request: function(config) { config.headers["Access-Control-Allow-Origin"] = "*"; config.headers["Access-Control-Allow-Methods"] = "GET, POST, OPTIONS"; config.headers["Access-Control-Allow-Headers"] = "Content-Type"; config.headers["Access-Control-Request-Headers"] = "X-Requested-With, accept, content-type"; return config; } }; } ]); app.config(["$httpProvider", function ($httpProvider) { $httpProvider.interceptors.push("CORSInterceptor"); }]);
根据 Firebug,这导致以下请求:
OPTIONS //Login/Connect HTTP/1.1
Host: localhost:49815
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://localhost:50739
Access-Control-Request-Method: POST
Access-Control-Request-Headers: access-control-allow-headers,access-control-allow-origin,content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
以及以下响应:
HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/10.0
Public: OPTIONS, TRACE, GET, HEAD, POST
X-SourceFiles: =?UTF-8?B?RDpcVEZTXElVV2ViXEdhcE5ldFNlcnZlclxBU1BTZXJ2aWNlc1xMb2dpblxDb25uZWN0?=
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: *
Access-Control-Request-Headers: X-Requested-With, accept, content-type
Date: Tue, 01 Sep 2015 13:05:23 GMT
Content-Length: 0
Firefox 仍然阻止请求并显示以下消息:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:49815//Login/Connect. (Reason: missing token 'access-control-allow-headers' in CORS header 'Access-Control-Allow-Headers' from CORS preflight channel).
问题是,某些浏览器还不允许 Access-Control-Allow-Headers
的 *
通配符。具体来说,Firefox 69 及更早版本不会。参见 https://bugzilla.mozilla.org/show_bug.cgi?id=1309358。
因此,为确保您在所有浏览器中获得正确的行为,您发送回的 Access-Control-Allow-Headers
值应明确列出您实际需要从前端代码访问的所有 header 名称;例如,在问题的情况下:Access-Control-Allow-Headers: Content-Type
.
无需对所有 header 名称进行硬编码即可实现这一点的方法是:让您的 server-side 代码采用 Access-Control-Request-Headers
请求 header 的值浏览器发送,并将其回显到 Access-Control-Allow-Headers
响应的值中 header 您的服务器发回。
或者使用一些现有的库 CORS-enable 您的服务器。将 Access-Control-Request-Headers
request-header 值回显到 Access-Control-Allow-Headers
response-header 值是大多数 CORS 库通常会为您做的事情。
通常,我阅读的线程会建议几个不必要的配置步骤,这会造成混乱。其实很简单...
出于简单的目的,从 angular 客户端向 ASP 控制器发送跨站点请求:
- 不需要 angular 拦截器。
- 不需要服务器端的自定义过滤器。
唯一的强制修改是在服务器的web.config
中添加这个<system.webServer> <httpProtocol> <customHeaders> <clear /> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Content-Type"/> </customHeaders> </httpProtocol> </system.webServer>
我在我的 .net c# mvc 应用程序和 angular 8 中的客户端应用程序中进行了尝试,但它无法正常工作。在 web.config 中,我添加了
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="http://localhost:4200" />
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
</customHeaders>
</httpProtocol>
我还在 global.axax.cs 文件中添加了
void MvcApplication_AuthenticateRequest(object sender, EventArgs e)
{
Context.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
}
但它不起作用。在 chrome 中响应 header 它确实显示为:
Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Origin: http://localhost:4200 Access-Control-Allow-Origin: http://localhost:4200
但在请求中 header 它显示为
Access-Control-Request-Headers: access-control-allow-origin,content-type,x-iphoneclientid
而它需要像
x-iphoneclientid : 8E72FF50-548B
因为 x-iphoneclientid 是我在过滤器 class 中验证的令牌
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
if (request == null || request.RequestUri == null)
{
return null;
}
// Write your Authentication code here
IEnumerable<string> monsterApiKeyHeaderValues = null;
// Checking the Header values
if (request.Headers.TryGetValues("x-iphoneclientid", out monsterApiKeyHeaderValues))
以上条件未找到,因此拒绝它并且未到达控制器。
我什至在我的控制器中添加了以下内容
[EnableCors("", "", "*")]
请指导一下
谢谢