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

相关推荐
林恒smileZAZ2 小时前
Vue<前端页面版本检测>
前端·javascript·vue.js
码事漫谈5 小时前
当AI开始“思考”:我们是否真的准备好了?
前端·后端
沃尔威武5 小时前
数据库 Sinks(.net8)
数据库·.net·webview
许杰小刀6 小时前
ctfshow-web文件包含(web78-web86)
android·前端·android studio
014-code6 小时前
订单超时取消与库存回滚的完整实现(延迟任务 + 状态机)
java·开发语言
lly2024066 小时前
组合模式(Composite Pattern)
开发语言
我是Superman丶6 小时前
Element UI 表格某行突出悬浮效果
前端·javascript·vue.js
恋猫de小郭6 小时前
你的代理归我了:AI 大模型恶意中间人攻击,钱包都被转走了
前端·人工智能·ai编程
游乐码7 小时前
c#泛型约束
开发语言·c#
Dontla7 小时前
go语言Windows安装教程(安装go安装Golang安装)(GOPATH、Go Modules)
开发语言·windows·golang