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

问题描述 投票:0回答:3

我正在使用 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/closeHTTP/1.1

接受:/

来源:http://localhost:12528

访问控制请求方法:PUT

访问控制请求标头:接受

UA-CPU:AMD64

接受编码:gzip、deflate

用户代理: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();
}
c# asp.net asp.net-core-webapi preflight
3个回答
3
投票

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

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


2
投票

我遇到了类似的问题,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();
}}

1
投票

我能够解决这个问题。我正在遵循有关如何在全球范围内启用 CORS 的 Microsoft 指南。我在 Startup.cs 文件中设置以下代码...

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

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

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

我还添加了AllowAnyHeader(如上所述),一切都很好! HTH

© www.soinside.com 2019 - 2024. All rights reserved.