当前位置:首页 > 工具 > 正文内容

ASP.NET Core Web API 跨域资源共享 (CORS) 配置实战

访客 工具 2026年7月6日 1

在 Web 开发中,当一个域的 JavaScript 脚本尝试请求另一个域的资源时,会触发浏览器的同源策略限制。所谓"跨域",是指协议、域名或端口号中任意一项不一致。在前后端分离的架构中,前端应用(如 Vue 或 React)通常与后端 Web API 部署在不同的域,因此配置跨域资源共享(CORS)是必不可少的环节。

1. 跨域的基本概念

默认情况下,出于安全考虑,浏览器会拦截跨域的 Ajax 请求。解决跨域问题的常见方案包括:

  • JSONP(仅支持 GET 请求,已趋于淘汰)。
  • 反向代理(如 Nginx 代理)。
  • 服务端配置 CORS(跨域资源共享),这是目前最主流且标准的做法。

2. 在 ASP.NET Core 中集成 CORS

要在 ASP.NET Core 项目中启用 CORS,首先需要确保项目中包含 Microsoft.AspNetCore.Cors 相关包(现代模板已内置)。随后在 Program.csStartup.cs 中进行配置。

注册跨域策略

在依赖注入容器中定义一个或多个跨域策略。我们可以从配置文件中读取允许的来源,以增强灵活性。

// 假设在 appsettings.json 中定义了:
// "AllowedHostsList": "http://localhost:3000,http://www.example.com"

var builder = WebApplication.CreateBuilder(args);

// 获取配置的来源
var allowedOrigins = builder.Configuration.GetValue<string>("AllowedHostsList")?.Split(',') ?? Array.Empty<string>();

builder.Services.AddCors(options =>
{
    options.AddPolicy("CustomCorsPolicy", policy =>
    {
        policy.WithOrigins(allowedOrigins) // 允许指定的域名访问
              .AllowAnyHeader()            // 允许任何请求头
              .AllowAnyMethod()            // 允许任何 HTTP 方法
              .AllowCredentials();         // 允许携带 Cookie 等凭据
    });
});

启用中间件

在请求处理管道中,必须正确放置 CORS 中间件。通常它应该位于 UseRouting 之后,并在 UseAuthorization 之前。

var app = builder.Build();

app.UseRouting();

// 启用跨域中间件,并应用指定的策略
app.UseCors("CustomCorsPolicy");

app.UseAuthorization();

app.MapControllers();
app.Run();

3. 在控制器中应用跨域特性

除了全局配置外,你还可以通过特性(Attribute)更精细地控制哪些 Controller 或 Action 支持跨域。这在只需要对部分接口开放跨域时非常有用。

using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;

namespace MyWebApi.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    // 在控制器级别启用指定的跨域策略
    [EnableCors("CustomCorsPolicy")]
    public class DataController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get()
        {
            return Ok(new { Message = "跨域请求成功!" });
        }

        [HttpPost]
        [DisableCors] // 也可以针对特定的 Action 禁用跨域
        public IActionResult SecurePost()
        {
            return Ok();
        }
    }
}

4. 注意事项

在配置 AllowCredentials() 时,WithOrigins 不能使用通配符 *。必须明确指定允许的来源域名,否则浏览器出于安全机制会拒绝执行。如果需要支持动态的任意域且携带凭据,需要通过逻辑判断来动态设置允许的 Origin 头。

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。