在 .NET Core 中,响应被 CORS 策略阻止,尽管我已经在使用中间件
In .NET Core, Responses are being blocked By CORS policy although I'm alredy using the middleware
在 Firefox 中我遇到了这个错误:
Access to XMLHttpRequest at 'http://localhost:5000/api/Sessions' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.
通常这是中间件的顺序问题,但我尝试更改它但不起作用
Startup.cs 配置服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddControllers();
Starup.cs 配置
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "User.Manager.Webapi v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());
app.UseAuthorization();
app.UseHttpMetrics();
app.UseMiddleware<JwtMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapMetrics();
});
我认为其余的中间件有问题
问题不在于中间件本身。根据 Microsoft 文档,您的操作是正确的。
问题是您正在通过 HTTP 端口 (5000) 执行 API 调用,而您的 API 由于以下代码行强制将 HTTP 请求重定向到 HTTPS (它在后台添加了 HttpsRedirectionMiddleware)。
app.UseHttpsRedirection();
您的预检请求是通过 HTTP 发出的,您的 API 试图将其重定向到 HTTPS,但失败了。您可以阅读更多 here.
所以,你有两个解决方案:
让您的客户端应用程序使用 HTTPS 端口 (5001) 来调用您的 API。
在除开发以外的所有环境中添加此中间件 - 这是我通常在我的项目中所做的。
if (!env.IsDevelopment())
{
app.UseHttpsRedirection();
}
如果您在本地 IIS 中托管 api,IIS 可能需要安装另一个模块才能使 Cors 功能正常工作。
验证这是否是根本原因的一种方法
- Visual Studio -> 调试 -> IIS -> 运行
按照此 link 安装所需的模块
https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-6.0
在 Firefox 中我遇到了这个错误:
Access to XMLHttpRequest at 'http://localhost:5000/api/Sessions' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.
通常这是中间件的顺序问题,但我尝试更改它但不起作用
Startup.cs 配置服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddControllers();
Starup.cs 配置
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "User.Manager.Webapi v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());
app.UseAuthorization();
app.UseHttpMetrics();
app.UseMiddleware<JwtMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapMetrics();
});
我认为其余的中间件有问题
问题不在于中间件本身。根据 Microsoft 文档,您的操作是正确的。
问题是您正在通过 HTTP 端口 (5000) 执行 API 调用,而您的 API 由于以下代码行强制将 HTTP 请求重定向到 HTTPS (它在后台添加了 HttpsRedirectionMiddleware)。
app.UseHttpsRedirection();
您的预检请求是通过 HTTP 发出的,您的 API 试图将其重定向到 HTTPS,但失败了。您可以阅读更多 here.
所以,你有两个解决方案:
让您的客户端应用程序使用 HTTPS 端口 (5001) 来调用您的 API。
在除开发以外的所有环境中添加此中间件 - 这是我通常在我的项目中所做的。
if (!env.IsDevelopment())
{
app.UseHttpsRedirection();
}
如果您在本地 IIS 中托管 api,IIS 可能需要安装另一个模块才能使 Cors 功能正常工作。
验证这是否是根本原因的一种方法
- Visual Studio -> 调试 -> IIS -> 运行
按照此 link 安装所需的模块 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-6.0