在前后端分离的项目中,"跨域"几乎是每个开发者都会遇到的硬伤。
你前端调用接口时,一旦出现:
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
{
...
}
这样其他接口仍然受限,更安全。
跨域本质是浏览器的安全策略,不是接口坏了。
解决跨域只要两步:
-
注册 CORS 策略
-
启用 UseCors