You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7+Angular跨域预检请求报错:不允许重定向

解决.NET 7中CORS预检请求重定向问题

问题场景

从源地址'http://localhost:4200'访问'http://localhost:5000/api/auth/login'的XMLHttpRequest被CORS策略阻止:预检请求的响应未通过访问控制检查:预检请求不允许重定向。

使用.NET 7框架、Google Chrome浏览器和Angular前端,已尝试调整Program.cs中的CORS策略、更换浏览器,但错误依旧。

问题根源

结合你提供的代码,核心问题有两个:

  1. 中间件顺序错误:UseHttpsRedirection、UseAuthentication、UseAuthorization在UseCors之前执行,导致预检请求还没通过CORS校验就触发了重定向或身份验证逻辑,违反浏览器安全规则。
  2. 无效/重复配置:代码中存在两段完全重复的应用构建逻辑,且第二段CORS配置的WithOrigins()未指定任何源,等于未开启针对性CORS支持。

修复方案

1. 修正中间件执行顺序

CORS中间件必须优先于身份验证、授权、HTTPS重定向执行,确保预检请求先完成CORS校验。正确顺序:

  • UseHttpsRedirection(若需强制HTTPS)
  • UseCors
  • UseAuthentication
  • UseAuthorization

2. 规范CORS策略配置

明确指定前端源地址,保留必要的允许规则,移除重复的应用构建代码。

修复后的完整代码

var builder = WebApplication.CreateBuilder(args);

// 注册控制器服务
builder.Services.AddControllers();

// 配置CORS策略
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAngular", policy =>
    {
        policy.WithOrigins("http://localhost:4200", "https://localhost:4200")
              .AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials();
    });
});

// 注册自定义服务与身份服务
builder.Services.AddApplicationServices(builder.Configuration);
builder.Services.AddIdentityServices(builder.Configuration);

// 配置数据库上下文
builder.Services.AddDbContext<DataContext>(opt => 
{
    opt.UseMySql("server=localhost; user=appuser; password=Password1; database=vitradapp", 
            new MySqlServerVersion(new Version(8, 0, 21)));
});

builder.Services.AddScoped<ITokenService, TokenService>();     

var app = builder.Build();

// 中间件执行顺序
app.UseHttpsRedirection();
app.UseCors("AllowAngular");
app.UseAuthentication();
app.UseAuthorization();

// 静态文件与路由配置
app.UseDefaultFiles();
app.UseStaticFiles();
app.MapControllers();
app.MapFallbackToController("Index", "Fallback");

// 数据库迁移与种子数据初始化
using var scope = app.Services.CreateScope();
var services = scope.ServiceProvider;
try
{
    var context = services.GetRequiredService<DataContext>();
    var userManager = services.GetRequiredService<UserManager<User>>();
    var roleManager = services.GetRequiredService<RoleManager<Role>>();
    await context.Database.MigrateAsync();
    
    Seed.SeedRoles(context, roleManager);
    Seed.SeedUsers(context, userManager);
    Seed.SeedClientPreference(context);
}
catch (Exception ex)
{
    var logger = services.GetService<ILogger<Program>>();
    logger.LogError(ex, "迁移过程中发生错误");
}

app.Run();

额外检查项

  • 确认Angular应用确实使用http://localhost:4200或https://localhost:4200访问,无端口/域名不一致情况。
  • 若后端强制HTTPS,前端需同步使用HTTPS访问,避免跨协议CORS问题。
  • 检查AddIdentityServices内部是否存在未认证重定向逻辑,需针对OPTIONS请求跳过身份验证拦截。

内容的提问来源于stack exchange,提问作者GolfBravo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:13:26