【发布时间】:2021-11-11 08:11:53
【问题描述】:
为此,我们在 StackOverflow 上进行了很多研究,但似乎无法让它发挥作用。
我们的场景如下。我们有服务器 A 和服务器 B。 服务器 A 是一个与服务器 B 通信的 Web API,服务器 B 也是一个 Web API。 服务器 B 应该只处理来自服务器 A 的 http 请求并拒绝所有其他请求。 我们正在尝试通过使用 cors 来强制执行此操作
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(name: "AllowSpecificOrigin", builder =>
{
builder.WithOrigins(new string[0]); // Empty list as a test.
});
});
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
{
app.UseRouting();
app.UseCors("AllowSpecificOrigin");
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
...
}
但现在在我们的一个控制器中,有两种方法。一种需要 CORS,另一种不需要。
[ApiController]
[Route("api/Server")]
public sealed class ServerController : ControllerBase
{
[HttpGet]
[Route("ServerCheck")]
[DisableCors]
public IActionResult ServerCheck()
{
return Ok(true);
}
[HttpGet]
[Route("Version")]
[EnableCors("AllowSpecificOrigin")]
public IActionResult Version()
{
return Ok(GetType().Assembly.GetName().Version.ToString());
}
}
如果我知道通过 Postman 向这两种方法发出请求,两种方法都会提供答案。但是既然我们不允许任何来源,那么我们的请求怎么会在控制器中被处理呢?
CORS 是解决此问题的错误方法吗? 最好的方法是什么? 还是我们的配置完全错误?
在我们的 appsettings.json 或 appsettings.Development.json 中没有一行“AllowedHosts”。
【问题讨论】:
-
CORS 用于阻止来自浏览器的请求。来自 Postman 的请求发送不是来自浏览器的请求。您必须创建自定义中间件或过滤器来阻止来源。