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

相关推荐
user20585561518132 小时前
Windows 项目安装时报 `node-sass` 错误,如何快速处理
前端
LiaCode2 小时前
Redis 在生产项目的使用
前端·后端
LiaCode2 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战2 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
风骏时光牛马2 小时前
# Ruby基于Rails框架实现多角色权限管理与数据分页查询完整实战代码案例
前端
weedsfly2 小时前
迭代器、生成器与异步迭代——让数据“按需流动”的艺术
前端·javascript
xiaodaoluanzha2 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn2 小时前
Fetch 请求竞态终结者:AbortController 不只是用来"取消"的
前端
阡陌Jony2 小时前
关于前端路由中的参数问题的学习(一): params,query, hash(#)
前端
阡陌Jony2 小时前
缓存相关学习笔记(一):Service Worker 缓存
前端