C# .NET 如何解决跨域(CORS)

在前后端分离的项目中,"跨域"几乎是每个开发者都会遇到的硬伤。

你前端调用接口时,一旦出现:

Access to fetch at ... from origin ... has been blocked by CORS policy

这就意味着:

浏览器拦住了你的请求------不是接口坏了,而是跨域策略没开。

今天我用一个最常见的场景讲清楚:
picture 页面访问你的接口,怎么在 C# .NET 里解决跨域?

一、什么是"同源策略"?

浏览器在设计时,为了防止网站互相窃取数据,提出了一个规则:

同源策略(Same-Origin Policy) :

只有协议、域名、端口三者都相同,才算同源。

也就是说,下面这三种情况都会被认为"跨域":


二、跨域的三种常见情况

1)域名不同(最常见)

例如:

这两个域名不同,即使协议、端口都相同,也属于跨域。

原因 :浏览器认为这是两个不同的"站点",

它们之间互相请求数据可能会泄露用户隐私或被恶意利用。


2)协议不同(HTTP vs HTTPS)

例如:

协议不同,也属于跨域。

这是因为 HTTPS 是加密连接,浏览器会认为它和 HTTP 是不同的安全等级站点,

所以也会被限制。


3)端口不同

例如:

端口不同,同样也算跨域。

很多人以为"端口不同只是同一台机器",

但浏览器只认"协议+域名+端口"三者是否完全一致。


三、跨域问题为什么会发生?

跨域本质上是浏览器为了安全限制的结果。

你可以把它理解为:
浏览器不允许网页随便去访问别的站点的数据 ,

否则一个恶意网站就能:

  • 偷偷读取你的微信/银行/邮箱信息

  • 在你不知情的情况下替你操作

  • 窃取你的隐私

所以浏览器默认禁止跨域请求。


四、跨域怎么解决?(常见方法)

你有一个 picture 页面,域名是 https://xxxx

页面需要访问后端接口 https://xxxx 或其他域名。

这就是典型跨域:
前端域名 ≠ 后端域名

浏览器为了安全,默认阻止请求。

① 注册 CORS 策略(Program.cs)

cs 复制代码
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowPictureDomain", policy =>
    {
        policy.WithOrigins(
                "https://xxxx",
                "http://localhost:1123",
                "http://xxxx:1123")
              .AllowAnyHeader()
              .AllowAnyMethod();
    });
});

这段代码的意思是:

只允许这几个域名访问你的接口。

② 启用 CORS(Program.cs)

cs 复制代码
var app = builder.Build();

app.UseRouting();

// 关键:启用跨域
app.UseCors("AllowPictureDomain");

app.UseAuthorization();

app.MapControllers();

app.Run();

只要少了这一步,跨域依然会失败。

五、 只让某个接口允许跨域(更安全)

如果你只想让 PictureController 跨域:

cs 复制代码
[EnableCors("AllowPictureDomain")]
[ApiController]
[Route("api/[controller]")]
public class PictureController : ControllerBase
{
    ...
}

这样其他接口仍然受限,更安全。

跨域本质是浏览器的安全策略,不是接口坏了。

解决跨域只要两步:

  1. 注册 CORS 策略

  2. 启用 UseCors

相关推荐
老王爱玩车6 分钟前
动态内存管理
c语言·开发语言·学习·面试
I'm Jie12 分钟前
【开源】7 天,我用 Rust 复刻了 FinalShell!Rhost v1.0.0 发布
开发语言·rust·开源
能源革命29 分钟前
Vue 网格拖拽布局组件全景指南:7 大方案深度对比
前端·javascript·vue.js
kimnoic29 分钟前
Python常用命令提示符使用方法详解
开发语言·python
Crazy________30 分钟前
05Linux内存管理核心原理与运维实战
java·开发语言
Nebula_g32 分钟前
JavaSE拓展:工具类Executors
java·开发语言·后端·spring·基础·javase
扶风ff39 分钟前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
程序员老陆42 分钟前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
穆梓兰煊44 分钟前
AI供应链安全不再只是包安全,还涉及模型与数据
前端·数据库
deli0071 小时前
Skill 怎么写才被 Agent 命中?18 条规则做成 SKILL.md 校验器,规范样例 92 分
前端