跨域配置(CORS Configuration)-ASP.NET Core教程
更新记录
点击查看
2024年2月28日 优化结构。
2022年11月1日 从笔记迁移到博客。发布。
说明
Cross-Origin Resource Sharing,跨域资源共享
配置方式
在ASP.NET Core中有2种方式配置跨越:
1、中间件方式(middleware approach)
2、特性修饰方式(attributes approach)
中间件方式一般用于配置全局的CORS配置。特性修饰方式配置跨域一般用于指定的控制器和动作。适用范围不同。
中间件方式配置Cors(Implementing CORS using the middleware approach)
开启UseCors() 中间件
具体实现实际上很简单,ASP.NET Core已经内置支持,只用开启 UseCors() 中间件即可。
打开Startup.cs文件,在配置开启CORS中间件即可。
namespace PandaTest.API
{
public class Startup
{
...
public void Configure(IApplicationBuilder app, IWebHostingEnvironment env)
{
...
//开启CORS
app.UseCors(corsConfig =>
{
//具体的配置项
});
..
}
}
}
配置具体的Cors规则(直接在中间件中配置)
配置允许所有的域名。
app.UseCors(corsConfig =>
{
//允许所有域名
corsConfig.AllowAnyOrigin();
});
配置允许指定的域名。其他域名都会被block。
namespace Catalog.API
{
public class Startup
{
...
public void Configure(IApplicationBuilder app,
IWebHostingEnvironment env)
{
...
app.UseCors(corsConfig =>
{
//配置允许的域名
corsConfig.WithOrigins("https://panda666.com");
//注意:末尾不要带/
});
...
}
}
}
注意:有一个坑,允许的URL末尾不要带/
配置具体的Cors规则(在服务中定义规则 Policy,在中间件中调用)
namespace Catalog.API
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
...
//在服务中增加Cors服务
services.AddCors(corsOtions =>
{
//增加 Policy
corsOtions.AddPolicy("BlogDomainPolicy", corsConfig => {
//具体的配置项
corsConfig.WithOrigins("https://samuele.dev");
});
});
..
}
public void Configure(IApplicationBuilder app,IWebHostingEnvironment env)
{
...
//在中间件中启用Cors,并使用指定策略
app.UseCors("BlogDomainPolicy");
...
}
}
}
在单独的扩展方法中定义Cors相关的配置
可以在ConfigureServices()中配置服务 和 Configure 配置中间件。为了提高可复用性、可维护性,还可以把相关的配置放入到自定义的扩展方法中。
在项目中添加Extensions文件夹。在Extensions文件夹下,添加ServiceCorsExtensions.cs类文件
然后在 ServiceCorsExtensions.cs 类文件中写入。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebApplication6;
using Microsoft.Extensions.DependencyInjection;
namespace WebApplication6.Extensions
{
public static class ServiceCorsExtensions
{
/// <summary>
/// 配置跨域访问扩展方法
/// </summary>
/// <param name="services"></param>
public static void ConfigureCors(this IServiceCollection services) =>
//配置Cors
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy", corsConfig =>
corsConfig.AllowAnyOrigin() //配置允许的域名
.AllowAnyMethod() //配置允许的HTTP方法
.AllowAnyHeader()); //配置允许的头内容
});
}
}
说明:
AllowAnyOrigin()表示配置允许的域名,如果需要进行限制,可以使用WithOrigins("https://example.com")。
AllowAnyMethod()表示配置允许的HTTP方法,如果需要进行限制,可以使用WithMethods("POST", "GET")。
AllowAnyHeader()表示配置允许的头内容,如果需要进行限制,可以使用WithHeaders("accept", "contentype") 。
在Service中进行使用,在Startup.cs文件中的Startup类中
引入命名空间
using WebApplication6.Extensions;
配置服务,增加Cors服务。
public void ConfigureServices(IServiceCollection services)
{
//添加服务,使用自定义的扩展方法
services.ConfigureCors();
services.AddControllers();
}
配置中间件,启动Cors中间件。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
//使用跨域
app.UseCors("CorsPolicy");
//...
}
特性方式配置Cors(Implementing CORS using the attribute approach)
使用特性方式配置Cors,只在指定的Controller和Action上生效。配置和使用中间件配置大同小异。同样是先配置服务,在配置中间件。然后在指定的控制器或者动作方法上加入[EnableCors]特性修饰即可。
配置服务,增加Cors服务,并新增一个Policy策略。
builder.Services.AddCors(options =>
{
options.AddPolicy("PandaPolicy", policyConfig =>
{
policyConfig.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
配置中间件,增加 Cors 中间件。
//启用Cors中间件
app.UseCors();
引入命名空间
using Microsoft.AspNetCore.Cors;
使用 [EnableCors] 特性启用,需要指定我们设置好的Policy策略。
namespace Catalog.API.Controllers
{
[Route("api/items")]
[ApiController]
[JsonException]
[EnableCors("BlogDomainPolicy")]
public class ItemController : ControllerBase
{
}
}
还可以在同一个控制器中,使用不同的 Policy 策略。
namespace Catalog.API.Controllers
{
[Route("api/items")]
[ApiController]
[JsonException]
//启用Cors
[EnableCors("BlogDomainPolicy")]
public class ItemController : ControllerBase
{
...
[HttpGet("{id:guid}")]
//启用Cors,策略不同
[EnableCors("GetByIdActionPolicy")]
public async Task<IActionResult> GetById(string id)
{
...
}
}
}
本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16846544.html