在 ASP.NET 中,对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】在 ASP.NET 中,对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头【英文标题】:In ASP.NET, Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header 【发布时间】:2018-02-14 17:56:00 【问题描述】:

我正在使用 Web Core API 并已按如下方式设置了 CORS;

    public void ConfigureServices(IServiceCollection services)
    
        services.AddCors();
        ...
    

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        
var url = Configuration["origenUrl"];
            var header = "Content-Type";
            app.UseCors(
                options => options.WithOrigins(url).WithHeaders(header).AllowAnyMethod().AllowCredentials()
            );
        

此设置适用于获取请求。 但是对于我的 Put 请求;

   $.ajax(
        url: url,
        method: "PUT",
        xhrFields:  withCredentials: true 
    )
        .done(callback)
        //.fail(errorMessage);
        .fail(function (jqXHR, textStatus, errorThrown) 
            alert("Something went wrong: " + textStatus + " " + errorThrown);
            errorCallback();
        );

我收到此错误消息;

XMLHttpRequest 无法加载http://localhost:17972/api/fault/1/close。

对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:12528” 使用权。响应的 HTTP 状态代码为 401。

来自 Fiddler 我的 http 请求是;

选项http://localhost:17972/api/fault/10/close HTTP/1.1

接受:/

来源:http://localhost:12528

访问控制请求方法:PUT

访问控制请求标头:接受

UA-CPU:AMD64

接受编码:gzip,放气

用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64;Trident/7.0; rv:11.0) 像 Gecko

主机:本地主机:17972

内容长度:0

DNT:1

连接:保持活动状态

编译指示:无缓存

那么我该如何解决这个问题?

编辑 我也试过这段代码只是为了让它工作,但我得到了同样的错误;

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        
            //var url = Configuration["originUrl"];
            //app.UseCors(
            //    options => options.WithOrigins(url).AllowAnyHeader().AllowAnyMethod().AllowCredentials()
            //);
            app.UseCors(
                options => options.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials()
            );
            app.UseMvc();

【问题讨论】:

你添加了内容类型吗? 我将“Content-Type”放在头变量中,然后将其包含在 WithHeaders 方法中,正如您在代码中看到的那样。从那以后,我尝试了“AnyHeader()”,结果相同。 对不起,我没有解释得这么详细,我说的是请求。您有原始 HTTP 请求吗? 来自 Fiddler:OPTIONS localhost:17972/api/fault/10/close HTTP/1.1 接受:/ 来源:localhost:12528 Access-Control-Request-Method:PUT Access-Control-Request-Headers:接受 UA-CPU: AMD64 Accept-Encoding: gzip, deflate User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; rv:11.0) like Gecko Host: localhost:17972 Content-Length: 0 DNT : 1 连接: Keep-Alive Pragma: no-cache 【参考方案1】:

我遇到了类似的问题,GET 请求可以正常工作,但 POST 请求会给我与 OP 一样的愤怒消息。 下面的代码对我有用,在我的情况下其他答案并不完整:

public void ConfigureServices(IServiceCollection services)

    services.AddCors(options =>
    
        options.AddDefaultPolicy(
            builder =>
            
                builder.WithOrigins("http://localhost:1337")
                       .AllowAnyHeader()
                       .AllowAnyMethod();
            );
    );

    services.AddControllers();
    services.AddRazorPages();

【讨论】:

【参考方案2】:

我知道这有点老了,但我刚刚遇到了同样的问题并且能够解决这个问题。我正在关注有关如何在全球范围内启用 CORS 的 Microsoft 指南。我在 Startup.cs 文件中设置了以下代码...

services.AddCors(options =>

    options.AddPolicy(MyAllowSpecificOrigins,
        builder =>
        
            builder.WithOrigins("http://localhost");
        );
);

该指南确实有一个使用 localhost 的示例,但它位于“测试 CORS”部分的最后。在那里,它们表明您还必须拥有端口号。 我将代码更改为:

services.AddCors(options =>

    options.AddPolicy(MyAllowSpecificOrigins,
        builder =>
        
            builder.WithOrigins("http://localhost:3000")
                .AllowAnyHeader();
        );
);

我还添加了 AllowAnyHeader(如上所述),一切正常! 高温

【讨论】:

【参考方案3】:

尝试使用 AllowAnyHeader 而不是 WithHeaders,它必须有效。 问题是您需要一个“Content-Type”标头,但没有被发送。 如果要保留 WithHeaders 检查,请添加“Access-Control-Request-Method”。

更多信息:https://docs.microsoft.com/en-us/aspnet/core/security/cors

【讨论】:

我试过了,但无济于事。我一直在查看链接 - 这是一个很好的链接 - 有一段时间试图弄清楚我能做什么。 您也可以避免使用库并在此处的 web.config 中添加 cors 规则:enable-cors.org/server.html 为了尝试让它工作,我现在使用 AllowAnyOrigin() 但这并不能解决问题 还是同样的问题?你能用新代码更新你的问题吗?

以上是关于在 ASP.NET 中,对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

来自 ASP NET Web API 的 CORS 阻止 Ajax POST 调用 - 对预检请求的响应未通过访问控制检查

React + ASP.Net Core 3:CORS 对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头

“对预检请求的响应未通过访问控制检查”是啥意思?

在禁用 Web 安全模式下运行的 chrome 中,对预检请求的响应未通过访问控制检查

对预检请求的响应未通过访问控制检查

对预检请求的响应未通过访问控制检查