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

相关推荐
IT_陈寒15 小时前
React状态管理终极对决:Redux vs Context API谁更胜一筹?
前端·人工智能·后端
晨星shine15 小时前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#
Kagol16 小时前
TinyVue 支持 Skills 啦!现在你可以让 AI 使用 TinyVue 组件搭建项目
前端·agent·ai编程
柳杉16 小时前
从零打造 AI 全球趋势监测大屏
前端·javascript·aigc
simple_lau16 小时前
Cursor配置MasterGo MCP:一键读取设计稿生成高还原度前端代码
前端·javascript·vue.js
睡不着先生16 小时前
如何设计一个真正可扩展的表单生成器?
前端·javascript·vue.js
天蓝色的鱼鱼16 小时前
模块化与组件化:90%的前端开发者都没搞懂的本质区别
前端·架构·代码规范
明君8799716 小时前
Flutter 如何给图片添加多行文字水印
前端·flutter
leolee1816 小时前
Redux Toolkit 实战使用指南
前端·react.js·redux
bluceli16 小时前
React Hooks最佳实践:写出优雅高效的组件代码
前端·react.js