【问题标题】:CORS With Enable OPTIONS Header on ASP Net Core 5 Web Api在 ASP Net Core 5 Web Api 上启用 OPTIONS 标头的 CORS
【发布时间】: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


【解决方案1】:

我觉得你可以试试这个语法

services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>
            {
                builder.AllowAnyOrigin()
                       .AllowAnyMethod()
                       .AllowAnyHeader();
            }));

【讨论】:

  • 这个我已经试过了,还是不行。
  • 请再试一次。只需复制和粘贴
  • 好的,我只是复制和粘贴。还是一样的错误。
  • 什么是同样的错误?方法不允许?
  • 是的。完全一样。
【解决方案2】:

@PaulWheeler on cmets 在上面的 cmets 上说:您收到来自 Postman 的 OPTIONS 请求的 405 响应的原因是因为 ASP.Net 至少需要“访问控制请求方法”和当 CORS 中间件处理此类请求时,为此类请求指定“Origin”标头(您有后者,但没有前者)。由于您使用的是 GET 并且通常被认为是“安全”操作,因此浏览器将在没有飞行前 OPTIONS 检查的情况下发出它。所以我猜这个错误是由其他问题引起的(即未处理的异常),浏览器上的 CORS 策略只是掩盖了这个问题。我不确定默认的 CORS 中间件是否会包含 500 个响应的标头。

在 Paul 指出可能的错误后,我对我的 Kestrel 日志进行了进一步调查,如下所示:

经过几项研究后,我发现我的问题出在我的证书上。

我为每个应用程序使用一个证书,而不是我应该与其他应用程序共享 Id Server 证书。

Tnx 保罗,

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2019-01-24
    • 1970-01-01
    • 2020-03-23
    • 2016-06-04
    • 2019-10-03
    • 2019-04-16
    • 2017-07-10
    • 2015-10-16
    相关资源
    最近更新 更多