在 .NET Core 中,响应被 CORS 策略阻止,尽管我已经在使用中间件

In .NET Core, Responses are being blocked By CORS policy although I'm alredy using the middleware

在 Firefox 中我遇到了这个错误:

Access to XMLHttpRequest at 'http://localhost:5000/api/Sessions' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.

通常这是中间件的顺序问题,但我尝试更改它但不起作用

Startup.cs 配置服务:

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

        services.AddControllers();

Starup.cs 配置

if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseSwagger();
            app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "User.Manager.Webapi v1"));
        }

        app.UseHttpsRedirection();

        app.UseRouting();
        
        app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());

        app.UseAuthorization();

        app.UseHttpMetrics();

        app.UseMiddleware<JwtMiddleware>();

        

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapMetrics();
        });

我认为其余的中间件有问题

问题不在于中间件本身。根据 Microsoft 文档,您的操作是正确的。

问题是您正在通过 HTTP 端口 (5000) 执行 API 调用,而您的 API 由于以下代码行强制将 HTTP 请求重定向到 HTTPS (它在后台添加了 HttpsRedirectionMiddleware)。

app.UseHttpsRedirection();

您的预检请求是通过 HTTP 发出的,您的 API 试图将其重定向到 HTTPS,但失败了。您可以阅读更多 here.

所以,你有两个解决方案:

  1. 让您的客户端应用程序使用 HTTPS 端口 (5001) 来调用您的 API。

  2. 在除开发以外的所有环境中添加此中间件 - 这是我通常在我的项目中所做的。

if (!env.IsDevelopment())
{
    app.UseHttpsRedirection();
}

如果您在本地 IIS 中托管 api,IIS 可能需要安装另一个模块才能使 Cors 功能正常工作。

验证这是否是根本原因的一种方法

  • Visual Studio -> 调试 -> IIS -> 运行

按照此 link 安装所需的模块 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-6.0