如何防止简单的CORS GET请求访问我的ASP.Net Core API服务器上的操作方法



为了说明我的问题,当您创建一个带有API端点的新项目时,我使用了默认的ASP.Net Core项目设置。这是我的Get动作方式的控制器:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}

这是我在Startup类中的Configure方法(如您所见,我在一开始添加了app.UseCors()(:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}

默认情况下,服务器在https://localhost:44391/上运行。现在,我的期望是,使用这样的默认设置,所有不是来自https://localhost:44391/的CORS请求都应该被CORS策略阻止。为了验证我做了以下步骤:

  1. 我启动了服务器,并在Get方法中设置了一个断点
  2. 为了模拟跨域(CORS(请求,我去了任何一个randon网站,例如。https://stackoverflow.com/打开Chrome开发工具,并在控制台中运行以下javascript,请求我的get方法:fetch("https://localhost:44391/weatherforecast").then(r=>r.text()).then(console.log);
  3. 现在,我预计服务器将发送一个CORS错误,并且我的Get方法将永远不会执行
  4. 实际发生的情况是,我的Get方法中的断点被击中,该方法被执行。只是在那之后,我在浏览器控制台中看到了CORS错误

我认为这种行为是错误的,因为如果请求来自另一个来源,我真的希望避免我的Get操作方法被完全执行。

所以基本上可以归结为两个问题:

  1. 为什么ASP.Net Core CORS策略以这种方式工作
  2. 是否有任何方法可以设置CORS,使所有操作方法永远不会执行,除非CORS策略允许?或者我需要为此编写一个自定义中间件吗

"实际发生的情况是,我的Get方法中的断点被击中并执行该方法。只是在那之后,我在我的浏览器控制台。。。我认为这种行为是错误的">

。。。不,这是预期的行为。CORS实际上是由浏览器根据服务器提供的标头以及请求是否受CORS限制来强制执行的。

服务器无法确定该请求是跨域AJAX请求还是其他类型的请求(因为HTTP请求中的数据不能可靠地提供这些信息(,因此无法直接拒绝该请求。它所能做的就是设置CORS头,告诉客户端如果请求实际上受到CORS限制,该做什么。

因此,如果您的请求到达服务器,它将始终被执行,只有当响应和标头返回到浏览器时,浏览器才会决定是否允许请求页面实际看到响应。

直接回答您的两个问题:

  1. 这就是CORS的工作原理,它不仅仅是ASP.NET。请参阅上面的解释
  2. 没有。同样,请参阅上面的解释。(这里唯一的例外是需要飞行前OPTIONS请求的请求,其中必须向服务器发出单独的初始HTTP OPTIONS申请-在这种情况下,除非OPTIONS要求指示允许请求,否则Action方法不会被命中。(

此优秀资源提供了更多详细信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

最新更新