在ASP.NET中,对预检请求的响应没有通过访问控制检查:否'访问控制 - 允许 - 来源'头

时间:2017-09-06 09:42:44

标签: c# asp.net asp.net-core-webapi preflight

我正在使用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()
            );
        }

此设置适用于Get Requests。 但是对于我的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

     

对预检请求的响应未通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:12528'因此是不允许的   访问。响应的HTTP状态代码为401。

来自Fiddler我的http请求是;

  

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

     

接受: /

     

原产地:http://localhost:12528

     

访问控制请求方法:PUT

     

Access-Control-Request-Headers:accept

     

UA-CPU:AMD64

     

Accept-Encoding:gzip,deflate

     

User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64; Trident / 7.0; rv:11.0),如Gecko

     

主持人:localhost:17972

     

内容长度:0

     

DNT:1

     

连接:Keep-Alive

     

Pragma:no-cache

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

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

 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();
}

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

该指南确实有一个使用本地主机的示例,但是它仅在“ Test CORS”部分中。在那里,它们表明您还必须具有端口号。 我将代码更改为:

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

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

答案 2 :(得分:0)

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

res = Vjunk - beta * V