.NET 6.0 Web api 中的 CORS

Posted

技术标签:

【中文标题】.NET 6.0 Web api 中的 CORS【英文标题】:CORS in .NET 6.0 web api 【发布时间】:2021-12-20 01:55:07 【问题描述】:

我有一个使用 Axios 调用 .NET 6 Web API 的 React 应用程序。

在 program.cs 文件中,我添加了 builder.Services.AddCors 和 app.UseCors,如下所示。

但我仍然收到 CORS 错误和 404 预检。

用于在 .NET 5 Web Api 中工作的方法。

我们需要为 .NET 6 Web Api 设置什么吗?

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Models;
<removed>

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddCors();

// Add services to the container.
<removed>

// App settings
<removed>

<removed>

builder.Services.AddHttpContextAccessor();

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    
        options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
    );

// AutoMapper
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();

<removed>

// Firebase
<removed>

var app = builder.Build();

CORS 注册是

app.UseCors(x => x.AllowAnyHeader()
      .AllowAnyMethod()
      .WithOrigins("https://our-react-site.com"));

还有剩下的代码

// Configure the HTTP request pipeline. 
if (app.Environment.IsDevelopment())

    app.UseSwagger();
    app.UseSwaggerUI();


app.UseSwagger();
app.UseSwaggerUI();

app.UseHttpsRedirection();

app.UseAuthentication();

app.UseAuthorization();

app.MapControllers();

app.Run();

【问题讨论】:

什么意思不工作? 当我们在 Chrome 中加载 React APP 时,我们得到:CORS 错误和 404 预检。 你打错了UseCors 电话 ***.com/questions/31942037/… 通过允许选项动词解决的问题。 【参考方案1】:

CORS docs 解释说 UseCors 中间件需要以正确的顺序调用。

必须以正确的顺序调用 UseCors。有关详细信息,请参阅Middleware order。例如,在使用 UseResponseCaching 时,必须在 UseResponseCaching 之前调用 UseCors。

Middleware Order部分显示UseCors需要在重定向和路由之后、身份验证和授权之前调用。

在您的代码中,您必须在UseHttpsRedirection 之后和UseAuthentication 之前调用UseCors

app.UseHttpsRedirection();


app.UseCors(x => x.AllowAnyHeader()
      .AllowAnyMethod()
      .WithOrigins("https://our-react-site.com"));

app.UseAuthentication();

文档示例显示了这一点:

var  MyAllowSpecificOrigins = "_myAllowSpecificOrigins";

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddCors(options =>

    options.AddPolicy(name: MyAllowSpecificOrigins,
                      builder =>
                      
                          builder.WithOrigins("http://example.com",
                                              "http://www.contoso.com");
                      );
);

// services.AddResponseCaching();

builder.Services.AddControllers();

var app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseCors(MyAllowSpecificOrigins);

app.UseAuthorization();

app.MapControllers();

app.Run();

另一个区别是文档示例创建了至少一个命名策略并使用UseCors 来应用此策略。

【讨论】:

谢谢。不知何故,代码在本地工作,但不能在现场工作(托管在 IIS 10 上)。服务器 / IIS 上是否有任何可能导致此问题的设置? web.config 文件和本地一样。 ***.com/questions/31942037/… 通过允许 OPTIONS 动词解决问题

以上是关于.NET 6.0 Web api 中的 CORS的主要内容,如果未能解决你的问题,请参考以下文章

为 Web API 1、.net 4.0 启用 CORS 中的问题

使用 Windows 身份验证启用 CORS ASP.NET Web API 2 应用程序中的预检请求

CORS 在 web api 中的 POST 失败

在 Azure 上为 .NET Web Api 启用 CORS

如何在 asp.net web apis 中启用 cors 选项。?

.Net Core Api 模板 CORS 问题来自 axios