如何为ASP.NET Core中特定端点开启任意跨域访问?
为特定ASP.NET Core端点开放任意跨域来源访问
步骤1:新增允许任意Origin的CORS策略
在ConfigureServices方法中,除了已有的AllowLocalApp策略,添加一个专门开放所有来源的策略(注意跨域凭证的兼容性问题):
private const string AllowLocalApp = "_myAllowLocalApp"; private const string AllowAnyOrigin = "_allowAnyOrigin"; // 新增策略标识 string[] corsEnabledOrigins = configuration.GetSection("CORSEnabled").Get<string[]>(); services.AddCors(options => { // 原有受限来源策略 options.AddPolicy( name: AllowLocalApp, policy => { policy.WithOrigins(corsEnabledOrigins) .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); // 新增允许任意Origin的策略 options.AddPolicy( name: AllowAnyOrigin, policy => { // 无需跨域凭证时使用此配置 policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); // 若需携带Cookie/认证凭证,替换为以下配置(浏览器不允许AllowAnyOrigin与AllowCredentials共存) // policy.SetIsOriginAllowed(_ => true) // .AllowAnyHeader() // .AllowAnyMethod() // .AllowCredentials(); }); });
步骤2:在目标端点绑定新策略
直接在需要开放的端点上添加[EnableCors]属性,指定新增的策略名称即可,无需使用[DisableCors]:
[Route("[controller]")] [ApiController] public class AuthsController : ControllerBase { [HttpGet("confirm")] [EnableCors(AllowAnyOrigin)] // 绑定开放策略 public async Task<IActionResult> ConfirmAccount([FromQuery] string userId, [FromQuery] string token) { // 业务逻辑实现 return Ok(); } }
关键注意事项
- 中间件顺序:确保
app.UseCors()位于app.UseRouting()之后、app.UseAuthorization()之前,否则端点上的CORS属性不会生效:app.UseRouting(); // 必须放在此位置才能让属性策略生效 app.UseCors(AllowLocalApp); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - 跨域凭证限制:浏览器禁止同时设置
AllowAnyOrigin和AllowCredentials,如果需要跨域携带凭证,必须用SetIsOriginAllowed(_ => true)替代AllowAnyOrigin()。
内容的提问来源于stack exchange,提问作者denislav licov
相关产品推荐
相关产品推荐

