ASP.NET Core 配置跨域(CORS)策略,核心是通过
AddCors注册服务 +
UseCors启用中间件,并在控制器或方法上指定策略名称。关键不是“开不开”,而是“怎么精准控制谁、哪些请求、允许什么操作”。
注册 CORS 服务并定义命名策略
在
Program.cs(.NET 6+)中,调用
AddCors添加服务,并用
AddPolicy定义一个带名字的策略。策略里明确允许的源、方法、头等: 用
WithOrigins("https://example.com") 限制具体前端域名(不建议用 "*",尤其带凭据时) 用
AllowAnyMethod()或
WithMethods("GET", "POST") 控制 HTTP 方法
用 AllowCredentials()允许携带 Cookie/Authorization(此时
WithOrigins不能为
"*") 用
WithHeaders("Content-Type", "X-Requested-With") 或 AllowAnyHeader()控制请求头
示例:
builder.Services.AddCors(options =>
{
options.AddPolicy("MyApiPolicy", policy =>
{
policy.WithOrigins("https://myapp.com")
.AllowAnyMethod()
.AllowCredentials()
.WithHeaders("Content-Type", "Authorization");
});
});启用 CORS 中间件并指定策略
在
UseCors调用时传入策略名,位置必须在
UseRouting之后、
UseEndpoints(或
MapControllers)之前:
app.UseRouting();
<p>app.UseCors("MyApiPolicy"); // ✅ 放这里</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/1915" title="Summarizer"><img
src="https://www.herecours.com/d/file/efpub/2026/21-21/20260221140415179527.jpg" alt="Summarizer" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/1915" title="Summarizer">Summarizer</a>
<p>基于 AI 的文本段落摘要生成器</p>
</div>
<a href="/ai/1915" title="Summarizer" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p>app.UseAuthentication();
app.UseAuthorization();</p><p>app.MapControllers();注意:
UseCors不会自动应用到所有端点——只有被路由匹配到且没被其他中间件短路的请求才生效。
按需应用策略:全局 / 控制器 / 方法级
策略注册后,有三种方式启用:
全局启用:在UseCors("xxx") 里指定策略名,所有匹配路由的请求都走该策略
控制器级别:在 Controller 类上加 [EnableCors("MyApiPolicy")]
方法级别:在 Action 方法上加 [EnableCors("MyApiPolicy")],可覆盖控制器策略
如果某个接口不需要跨域,就别加;如果要多个策略,可分别命名并在不同地方引用。
调试和常见坑点
遇到跨域失败,先看浏览器控制台的预检(OPTIONS)响应头是否含
Access-Control-Allow-Origin: 404 OPTIONS 请求?检查是否启用了
UseCors,且顺序正确 返回 204 但没头?确认策略名拼写一致,且
AddPolicy在
AddCors内部 带凭据却报错“Origin not allowed”?检查
WithOrigins没写成
"*",且协议、端口、子域名完全匹配 开发环境想临时放开?可定义一个
"DevPolicy"允许
http://localhost:3000等常用前端地址
基本上就这些。配置本身不复杂,容易忽略的是策略名匹配、中间件顺序、凭据与通配符互斥这三点。
