即使 .net webapi 允许所有方法,对 Web api 的调用也会被 CORS 策略阻止

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

更新: 即使我在 webapi 中对 program.cs 进行硬编码以始终设置 Access-Control-Allow-Origin 标头,但在使用 OPTIONS/POST 请求调用 api 时也不会设置标头。

因此,为了排除在调用 webapi 时托管 webapi 的服务器“外部”存在某些防火墙,我打开了服务器的远程桌面并在本地浏览我的 Web 应用程序。这应该使场景与我在开发机器上时“相同”。不幸的是,同样的事情发生了。除 GET 之外的所有类型的调用均“被 cors 策略阻止”。这让我抓狂,难道是网站上的任何配置阻止了某些呼叫?

请参阅下面的硬编码标头,即使在我的开发计算机上运行我的 webapp 和 webapi 时它仍然工作得很好:

 app.Use(async (ctx, next) =>
 {    
   var org = ctx.Request.Headers["Origin"];
   if (!string.IsNullOrWhiteSpace(org) && allowedOrigins.Contains(org))
   {
     ctx.Response.Headers.Append("Access-Control-Allow-Origin", org);
   }

   ctx.Response.Headers.Append("Access-Control-Allow-Credentials", "true");

   if (HttpMethods.IsOptions(ctx.Request.Method))
   {
     ctx.Response.Headers.Append("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS, PATCH");
     ctx.Response.Headers.Append("Access-Control-Allow-Headers", "content-type");
     await ctx.Response.CompleteAsync();
     return;
   }

   await next();
  });

我以为我了解如何为 .net 框架 webapi 配置 cors,但我不明白这个。

我有一个 vue/vuetify 网站和一个在同一服务器上运行的 .net Framework 8 webapi 网站。当然,在我的开发计算机上会出现错误,因为在开发人员的计算机上一切都工作正常。

但是,在我们的测试服务器上安装网站时,我们收到一个似乎与 cors 相关的错误。但是所有“GET”调用都工作正常,但没有 POST/PATCH 请求工作。 Chrome 控制台中记录的错误如下:

从源“https://crmappdev1:8051”访问“https://crmappdev1:8050/api/generic/getAnyServiceCarisma”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

在我的 webapi 中设置 CORS 时,我尽可能减少限制,允许所有方法和标头,但仍然没有成功。我注意到的唯一区别是,如果我不指定“AllowAnyMethod”,则所有调用都会失败,但如果我说“.AllowAnyMethod”或指定允许哪些方法,则“GET”开始工作,但所有其他类型都会失败。我发现了许多文章描述了如何在 Program.cs 中为 webapi 链接设置的顺序,并且我已经尝试了所有方法,但显然我遗漏了一些东西。如果有任何解决此问题的建议,我将不胜感激。

chrome 网络选项卡中 POST 的结果,正如您所看到的,在执行 POST 请求时它显示“未经授权”和“选项”,我认为这是一个提示,但我不知道该怎么做:

我的 Program.cs 的当前版本如下。在我的本地开发计算机上运行良好,但在服务器上安装时运行不佳:

public static void Main(string[] args)
{
 var builder = WebApplication.CreateBuilder(args);

 List<string> allowedOrigins = new List<string>
 {
    "http://localhost:8080",
    "http://localhost:8051",
    // DEV ENV
    "http://crmappdev1:8051",
    "https://crmappdev1:8051"        
};

builder.Services.AddCors(
    options =>
    {
        options.AddDefaultPolicy(
        policy =>
        {
            policy.WithOrigins(allowedOrigins.ToArray())
            //.AllowAnyMethod()
            //.WithMethods("GET", "PUT", "POST", "DELETE", "OPTIONS")
            //.AllowAnyHeader()
            //.AllowCredentials()
            ;
        }
);
    });

builder.Configuration
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true)
    .AddEnvironmentVariables();

// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    // By default, all incoming requests will be authorized according to the default policy.
    options.FallbackPolicy = options.DefaultPolicy;
});

builder.Services.AddMvc(option => option.EnableEndpointRouting = false).AddNewtonsoftJson();
var app = builder.Build();

app.UseSwagger();
app.UseSwaggerUI();
app.UseCors(
builder =>
{
    builder
    .WithOrigins(allowedOrigins.ToArray())
    .AllowAnyHeader()
    .AllowCredentials()
    .WithMethods("GET", "PUT", "POST", "DELETE", "OPTIONS", "PATCH")
    //.AllowAnyMethod()
    ;
});

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
.net axios cors preflight
1个回答
0
投票

你的答案是你的错误。

来源“https://crmappdev1.xxx.xxx.se:8051”已被 CORS 策略阻止

您需要添加

https://crmappdev1.xxx.xxx.se:8051
作为允许的来源

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