.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策略、更换浏览器,但错误依旧。
问题根源
结合你提供的代码,核心问题有两个:
- 中间件顺序错误:
UseHttpsRedirection、UseAuthentication、UseAuthorization在UseCors之前执行,导致预检请求还没通过CORS校验就触发了重定向或身份验证逻辑,违反浏览器安全规则。 - 无效/重复配置:代码中存在两段完全重复的应用构建逻辑,且第二段CORS配置的
WithOrigins()未指定任何源,等于未开启针对性CORS支持。
修复方案
1. 修正中间件执行顺序
CORS中间件必须优先于身份验证、授权、HTTPS重定向执行,确保预检请求先完成CORS校验。正确顺序:
UseHttpsRedirection(若需强制HTTPS)UseCorsUseAuthenticationUseAuthorization
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
相关产品推荐
相关产品推荐

