在 ASP.NET Core 6 中启用 CORS

w2o*_*ves 5 .net-core asp.net-core asp.net-core-webapi

我有一个 ASP.NET Core 6 Web API,它有一个反应前端。

我想使用命名策略来启用 cors,这样我就可以在我的启动中使用

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("MyPolicy",
            builder => builder.WithOrigins("http://localhost:3000/"));
    });
 
    services.AddControllersWithViews();
}
 
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
 
    app.UseHttpsRedirection();
 
    // Shows UseCors with named policy.
    app.UseCors("MyPolicy");
 
    app.UseStaticFiles();
 
    app.UseRouting();
 
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}
Run Code Online (Sandbox Code Playgroud)

现在我可以在控制器中这样调用它:

[EnableCors("MyPolicy")]
public class ProductsController : ControllerBase
Run Code Online (Sandbox Code Playgroud)

这在 .NET Core 3.1 中有效,但在 .NET 6 中无效。

在 ASP.NET Core 6 Web API 中执行此操作的正确方法是什么?

更改程序 CS 以适应 CORS 策略仍然不起作用

 public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();
            using var scope = host.Services.CreateScope();
           var context = scope.ServiceProvider.GetRequiredService<StoreContext>();
            var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>();
            try
            {
                context.Database.Migrate();
                DbInitializer.Initialize(context);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, "Problem migrating data");
            }

            var builder = WebApplication.CreateBuilder(args);
            var MyAllowSpecificOrigins = "AnotherPolicy";

            builder.Services.AddCors(options =>
            {
                options.AddPolicy(name: MyAllowSpecificOrigins,
                   builder =>
                   {
                       builder.AllowAnyOrigin()
                              .AllowAnyHeader()
                              .AllowAnyMethod();
                   });
            });

           var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
            builder.Services.AddDbContext<StoreContext>(options =>
        {
            options.UseSqlite(connectionString);
        });

            builder.Services.AddControllers();

            var app = builder.Build();

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseCors(MyAllowSpecificOrigins);

            app.UseAuthorization();

            app.MapControllers();

            try
            {
                app.Run();
            }
            catch (Exception)
            {

                throw;
            }
           //host.Run();


        }
Run Code Online (Sandbox Code Playgroud)

这给了我同样的错误 Access to fetch at 'http://localhost:5000/api/Products' from origin 'http://localhost:3000'已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:预检请求不允许重定向。

小智 7

在program.cs文件中:

app.UseCors(
  options => options.WithOrigins("*").AllowAnyMethod().AllowAnyHeader()
      );
Run Code Online (Sandbox Code Playgroud)