.net 中CORS 如何增强 Web 应用程序功能,促进不同 Web 域之间的数据和服务交换

科技   2024-10-22 05:41   上海  


跨域资源共享 (CORS) 是一种重要的安全机制,它允许 Web 浏览器强制执行同源策略,该策略限制网页向与它们来源不同的域发出请求。CORS 支持对不同域上的资源的受控访问,为 Web 应用程序提供了一种与其他源上托管的资源进行交互的方法。其主要目的是增强安全性,同时促进依赖跨域通信的现代 Web 应用程序的开发。通过了解 CORS,我们可以确保他们的 Web 应用程序在不同域中安全高效地运行。 跨域资源共享 (CORS) 是一种基于浏览器的安全功能,用于控制来自一个域的网页如何请求来自另一个域的资源并与之交互。它允许 Web 服务器通过向服务器的响应添加特定的 HTTP 标头来指定谁可以访问他们的资源。CORS 在保护敏感数据和防止未经授权访问资源方面发挥着至关重要的作用,有助于维护 Web 应用程序的安全。通过为跨域请求定义明确的策略,CORS 可以在遵守同源策略的限制的同时,在不同域之间实现受控且安全的资源共享。

为什么 CORS 对 Web 应用程序至关重要

CORS 对于需要从不同域(例如 API 或内容交付网络 (CDN))获取资源的 Web 应用程序至关重要。如果没有 CORS,Web 浏览器将阻止这些跨域请求,从而导致潜在的功能问题。通过允许受控的跨域访问,CORS 实现了各种服务和资源的无缝集成,有助于提供更具交互性和动态性的用户体验。它确保 Web 应用程序可以安全地与来自其他来源的授权资源通信,同时拒绝未经授权的请求,从而防范潜在的安全威胁。

同源策略及其限制

同源策略是由 Web 浏览器实施的一个基本安全概念,用于限制网页访问托管在与其自身域不同的域上的资源。此策略有助于防止恶意网站窃取数据或代表用户执行未经授权的操作。虽然同源策略对于安全性至关重要,但它可能会给合法需要跨源资源共享的 Web 应用程序带来挑战。CORS 通过允许服务器端配置显式定义哪些域可以访问资源,从而在安全性和受控数据共享之间取得平衡,从而为这些限制提供了解决方案。

CORS 的工作原理

跨域资源共享 (CORS) 是一种允许 Web 应用程序从不同域上的服务器访问资源的机制。以下是有关 CORS 工作原理的一些详细信息:

源和跨源请求

  • 如果请求是从与提供请求的服务器不同的域、协议或端口发出的,则认为该请求是跨域的

  • 可以使用 XMLHttpRequest 或 Fetch API 发出跨域请求

CORS 请求的类型:简单和预检

  • 简单请求是没有任何自定义标头的 GET、HEAD 和 POST 请求

  • 预检请求是在跨域请求之前发送的 OPTIONS 请求,用于检查服务器是否允许该请求

CORS 标头及其在流程中的角色

  • CORS 标头用于指示允许哪些源访问服务器的资源

  • Access-Control-Allow-Origin 标头指定允许哪些源访问资源

  • Access-Control-Allow-Methods 标头指定资源允许使用哪些 HTTP 方法

  • Access-Control-Allow-Headers 标头指定资源允许哪些标头

在客户端和服务器端处理 CORS

  • 在客户端,可以通过在请求中设置适当的标头来处理 CORS

  • 在服务器端,可以通过向应用程序管道添加中间件来处理 CORS

  • 在 .NET 中,可以通过调用 Startup 类的 Configure 方法中的“UseCors”方法来添加 CORS 中间件

可以通过将中间件添加到应用程序管道来完成在 .NET 中启用 CORS。中间件可以配置为允许特定的源、方法和标头访问服务器的资源。通过了解 CORS 的工作原理,我们可以确保他们的 Web 应用程序可以从不同域上的服务器访问资源。

以下是在 .NET 中启用 CORS 的示例代码:

在 Program.cs 文件中,将以下代码添加到 CreateHostBuilder 方法中。

public static IHostBuilder CreateHostBuilder(string[] args) =>  
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureServices(services =>
{
services.AddCors(options =>
{
options.AddPolicy("AllowAllOrigins",
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
});
webBuilder.Configure(app =>
{
app.UseCors("AllowAllOrigins");
// Other app configurations...
});
});

此代码添加了一个名为“AllowSpecificOrigins”的 CORS 策略,该策略允许从 http://example.com 和 http://test.com 访问服务器的资源。它还允许在请求中使用任何标头和方法。现在,如果在 http://example.com 上运行的脚本尝试访问 http://localhost:5000 上的资源,服务器将允许该请求。同样,如果在 http://test.com 上运行的脚本尝试访问 http://localhost:5000 上的资源,则服务器也将允许该请求。通过在 CORS 策略中指定允许的源,我们可以控制哪些域可以访问其服务器的资源。

在 .NET 中启用 CORS

除了上述简单示例外,还可以按照以下步骤在 .NET 中启用 CORS:

创建新的 .NET 项目

  • 打开 Visual Studio 并创建新的 .NET Core Web 应用程序项目。

  • 选择适当的项目模板,例如 Blank、MVC 或 API。

了解内置的 CORS 中间件

  • .NET 包括内置的 CORS 中间件,可用于为应用程序启用 CORS。

  • 可以通过调用 UseCors 方法将中间件添加到应用程序管道中。

为特定源配置 CORS 策略或允许所有

  • CORS 策略可以配置为允许特定源、标头和方法访问服务器的资源。

  • 要配置 CORS 策略,请将相应的中间件添加到应用程序管道中,并指定允许的来源、标头和方法。

以下是如何配置 CORS 策略以允许所有源、标头和方法的示例:

public void ConfigureServices(IServiceCollection services)  
{
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors("AllowAll");
// Other app configurations...
}

处理特定 HTTP 方法的 CORS 策略

  • 可以将 CORS 策略配置为允许特定的 HTTP 方法访问服务器的资源。

  • 要处理特定 HTTP 方法的 CORS 策略,请将相应的中间件添加到应用程序管道并指定允许的方法。

以下是如何配置 CORS 策略以允许 GET 和 POST 方法的示例:

public void ConfigureServices(IServiceCollection services)  
{
services.AddCors(options =>
{
options.AddPolicy("AllowMethods",
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.WithMethods("GET", "POST");
});
});
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors("AllowMethods");
// Other app configurations...
}

处理特定标头的 CORS 策略

  • CORS 策略可以配置为允许特定标头访问服务器的资源。

  • 要处理特定标头的 CORS 策略,请将相应的中间件添加到应用程序管道并指定允许的标头。

以下是如何配置 CORS 策略以允许 “Authorization” 标头的示例:

public void ConfigureServices(IServiceCollection services)  
{
services.AddCors(options =>
{
options.AddPolicy("AllowHeaders",
builder =>
{
builder.AllowAnyOrigin()
.WithHeaders("Authorization");
});
});
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors("AllowHeaders");
// Other app configurations...
}

处理凭证和 CORS

  • 将 CORS 与凭证一起使用时,必须将服务器配置为允许请求中的凭证。

  • 要允许凭据,请将相应的中间件添加到应用程序管道并指定允许的凭据。

以下是如何配置 CORS 策略以允许凭据的示例:

public void ConfigureServices(IServiceCollection services)  
{
services.AddCors(options =>
{
options.AddPolicy("AllowCredentials",
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors("AllowCredentials");
// Other app configurations...
}

在 .NET 中将 CORS 与 SignalR 配合使用

  • 要在 .NET 中将 CORS 与 SignalR 一起使用,请将相应的中间件添加到应用程序管道,并指定允许的源、标头和方法。

下面是如何为 SignalR 配置 CORS 策略的示例:

public void ConfigureServices(IServiceCollection services)  
{
services.AddCors(options =>
{
options.AddPolicy("AllowSignalR",
builder =>
{
builder.WithOrigins("http://example.com")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors("AllowSignalR");
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chat");
});
}

通过执行这些步骤并使用代码示例,我们可以在其 .NET 应用程序中启用 CORS 并控制哪些域可以访问其服务器的资源。

最佳实践和安全注意事项

在 .NET 中启用 CORS 涉及将服务器配置为允许来自特定域或所有域的请求。这是通过将中间件添加到应用程序管道并指定允许的来源、标头和方法来完成的。以下是在 .NET 中启用 CORS 的一些最佳实践和安全注意事项:

限制源以防止未经授权的访问

  • 为了防止未经授权访问服务器资源,我们应该将允许的源限制为仅需要访问的域。

  • 这可以通过将适当的中间件添加到应用程序管道并指定允许的源来完成。

使用 JWT 实施 CORS(JSON Web 令牌)

  • 使用 JWT 进行身份验证时,我们应该确保 JWT 令牌包含在 CORS 请求中。

  • 这可以通过将适当的中间件添加到应用程序管道并指定允许的标头来完成。

以下是如何配置 CORS 策略以允许使用 JWT 令牌的 “Authorization” 标头的示例:

public void ConfigureServices(IServiceCollection services)  
{
services.AddCors(options =>
{
options.AddPolicy("AllowHeaders",
builder =>
{
builder.AllowAnyOrigin()
.WithHeaders("Authorization");
});
});
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors("AllowHeaders");
// Other app configurations...
}

缓解潜在的 CORS 漏洞

  • 我们应该注意潜在的 CORS 漏洞,例如跨站点脚本 (XSS) 攻击和跨站点请求伪造 (CSRF) 攻击。

  • 为了缓解这些漏洞,我们应该确保将服务器配置为仅允许来自受信任域的请求,并且服务器正在正确验证请求。

记录和监控 CORS 相关问题

  • 我们应该记录和监控与 CORS 相关的问题,以检测和防止潜在的安全漏洞。

  • 这可以通过向应用程序添加适当的日志记录和监控工具来完成。

总之,在 .NET 中启用 CORS 是一项重要的安全功能,它允许网页访问来自不同域的资源,同时防止恶意网站访问敏感数据。通过遵循本文中概述的最佳实践和安全注意事项,我们可以确保他们的服务器被正确配置为仅允许来自受信任域的请求,并且服务器正在正确验证请求。

如果你喜欢我的文章,请给我一个赞!谢谢

架构师老卢
资深软件架构师, 分享编程、软件设计经验, 教授前沿技术, 分享技术资源(每天发布电子书),每天进步一点点...
 最新文章