Skip to content

跨域处理

如果系统之间需要交互,通常需要进行特殊的配置才能进行通讯。

什么是跨域

浏览器的安全性限制了网页向不同域发送请求,这种限制称为同源策略。同源策略防止恶意站点从另一站点读取敏感数据。有时,你可能希望允许其他站点对你的应用进行跨域请求。这就是跨域问题。

解决跨域的方法

要解决跨域问题,常用的方法有以下几种:

  • JSONP:通过动态创建 <script> 标签,利用 src 属性实现跨域请求,但仅支持 GET 请求。
  • CORS(跨域资源共享):服务器端设置响应头中的 Access-Control-Allow-Origin 字段,允许指定的域进行跨域请求。
  • 代理服务器:在服务器端设置一个代理,将前端请求转发给目标域,而不是直接从浏览器发送跨域请求。
  • WebSocket:使用 WebSocket 协议进行通信,WebSocket 协议没有同源策略的限制。
  • Nginx 推荐

信息

跨域问题仅存在于浏览器环境中,对于服务器端来说不存在跨域问题。

在 ASP.NET Core 中解决跨域

启用默认策略和中间件的 CORS

在 ASP.NET Core 中,可以通过配置 CORS 中间件来解决跨域问题。以下是一个示例配置:

csharp
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(policy =>
    {
        policy.WithOrigins("http://example.com", "http://www.contoso.com")
              .AllowAnyHeader()
              .AllowAnyMethod();
    });
});

builder.Services.AddControllers();

// 启用服务
var app = builder.Build();

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors(); // 启用 CORS 中间件
app.UseAuthorization();
app.MapControllers();
app.Run();

注意事项

  • 通常,在 UseCors 之前调用 UseStaticFiles
  • 使用 JavaScript 跨站点检索静态文件的应用必须在 UseStaticFiles 之前调用 UseCors

使用属性启用 CORS

可以将不同的 CORS 策略应用于具有 [EnableCors] 属性的控制器、页面模型或操作方法。如果将 [EnableCors] 属性应用于控制器、页面模型或操作方法,并且在中间件中启用了 CORS,则会应用两种策略。建议不要合并策略,使用 [EnableCors] 属性或中间件,两者不能同时使用。

示例

csharp
[EnableCors("MyPolicy")]
public class MyController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("This is a CORS-enabled endpoint.");
    }
}

禁用 CORS

[DisableCors] 属性不会禁用通过终结点路由已启用的 CORS。

总结

更多跨域相关知识可查看官方文档

最近更新