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

相关推荐
随风一样自由2 小时前
【前端独角兽】刚进入前端领域的前端开发用jQuery还是Vue3?
前端·javascript·vue3·jquery
IMPYLH3 小时前
HTML 的 <data> 元素
前端·html
西门吹-禅3 小时前
java springboot N+1问题
java·开发语言·spring boot
YHHLAI3 小时前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
skywalk81634 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
IT笔记5 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
kyriewen5 小时前
我扒了 GPT-5.6 的全部编程跑分——有一项 OpenAI 没敢放出来
前端·gpt·ai编程
2zcode5 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn
逝水无殇5 小时前
C# 运算符重载详解
开发语言·后端·c#
哥是强混6 小时前
Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务
网络·数据库·.net