【发布时间】:2021-08-04 01:34:12
【问题描述】:
我已经在 StackO 上阅读了所有类似的问题,以及许多其他链接,其中大多数与核心 2 和 3 相关。还阅读了所有 MS documentation for CORS,但仍然不明白出了什么问题。所以我会要求仔细阅读我将要写的内容,并查看我所拥有的所有证据。
在我的环境中,我确实有一个在 Kestrel 上运行的 Id Server 4 应用程序来处理身份验证,并且对于这个服务器,我已经让 CORS 工作正常,在我的 Id 服务器客户端上,我确实有与我的客户端相关的 ClientScopes(Angular 应用程序) .
Id Server 4 配置如下:
我的 localhost 应用程序可以正常调用 Id Server 并且工作正常:
但是当我调用另一个 web api (rede-dev) 时,我遇到了 CORS 问题:
尝试 GET 动词从 Postman 强制执行 Origin 标头,它确实可以正常工作,因为它不会预检请求:
但如果我尝试 OPTIONS,我无法在我的响应标题上看到我的 OPTIONS 动词,并且我有一个 405:
Startup.cs
因此,我根据 MS 文档也根据 middleware order 制作了所有 Startup.cs 询问的配置,但仍然无法正常工作。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder =>
{
builder.AllowAnyOrigin();
builder.AllowAnyMethod();
//builder.WithMethods("POST", "PUT", "DELETE", "GET", "OPTIONS");
builder.AllowAnyHeader();
builder.WithHeaders("Authorization");
});
});
//Json
services.AddControllers();
//services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
//Log
Serilog.Core.Logger serilog = new LoggerConfiguration().ReadFrom.Configuration(Configuration).CreateLogger();
和
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseForwardedHeaders();
}
else
{
app.UseExceptionHandler("/Error");
app.UseForwardedHeaders();
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("CorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseSwagger();
app.UseSwaggerUI(options =>
{
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
}
});
}
我在这里错过了什么?
提前致谢,
【问题讨论】:
-
尝试删除builder.WithHeaders("Authorization");
-
@Sergey 尝试删除 builder.WithHeaders("Authorization");并得到相同的结果。
-
还尝试切换 RequireHttpsMetadata 并且没有任何变化。但我没有尝试将其设置为“true”并在 HTTPS 下从 Angular App 调用。我应该吗?
-
我现在没有时间写这个作为答案,但是您收到来自 Postman 的 OPTIONS 请求的 405 响应的原因是因为 ASP.Net 要求至少 @ 987654337@ 和
Origin在 CORS 中间件处理此类请求时指定标头(您有后者,但没有前者)。 -
... 由于您使用的是 GET 并且这通常被认为是“安全”操作,因此浏览器将在没有飞行前 OPTIONS 检查的情况下发出它。所以我猜这个错误是由其他问题引起的(即未处理的异常),浏览器上的 CORS 策略只是掩盖了这个问题。我不确定默认的 CORS 中间件是否会包含 500 个响应的标头。
标签: c# asp.net-core cors kestrel