web-dev-qa-db-ja.com

Core 2.1は、Access-Control-Expose-Headersで応答することを拒否します:*

私はここで何か間違ったことをしているに違いありませんが、それを理解することはできません。私の知る限り、これはCORSの問題のようです。 Access-Control-Expose-Headers: *を任意のOriginに公開する必要がありますが、dotnet core2.1が期待どおりに動作していません。

関連するStartup.csコード:

        public void ConfigureServices(IServiceCollection services)
        {
            //Mapping settings to POCO and registering with container
            var settings = new AppSettings.ReportStorageAccountSettings();
            Configuration.Bind(nameof(AppSettings.ReportStorageAccountSettings), settings);

            services.AddCors(options =>
            {
                options.AddPolicy("AllowAll",
                    builder =>
                    {
                        builder
                            .AllowAnyHeader()
                            .AllowAnyMethod()
                            .AllowAnyOrigin()
                            .AllowCredentials();
                    });
            });
            services.AddSingleton(settings);
            services.AddApiVersioning();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseCors("AllowAll");
            app.UseHttpsRedirection();
            app.UseMvc();
        }

このアプリケーションはAzureでホストされており、念のため、AzureのCORS設定に*エントリを追加しました。これで、クライアントアプリケーション(Azureでもホストされている)がPOSTリクエストを行うたびに、JS経由でヘッダーにアクセスできなくなり、応答にAccess-Control-Expose-Headers: *が表示されなくなります。ただし、ネットワーク応答を調べたり、Fiddlerを使用したりすると、ヘッダーが表示されます。 JSの問題を除外するために、ヘッダーにアクセスするためにAxiosとJqueryを試しました。私はここで何が間違っているのですか?

コントローラーでは、次のように応答します。

 Response.Headers.Add("Location", $"api/someLocation");
 return StatusCode(StatusCodes.Status202Accepted);
8
S1r-Lanzelot

CorsPolicyBuilderの-​​ AllowAnyHeader メソッドは Access-Control-Allow-Headers 応答ヘッダー。これは プリフライトされたリクエスト にのみ使用されます。 Access-Control-Expose-Headers 応答ヘッダーは必要なものであり、 WithExposedHeaders を使用して構成されます。

完全な例を次に示します。

services.AddCors(options =>
{
    options.AddPolicy("AllowAll", builder =>
    {
        builder.AllowAnyHeader()
               .AllowAnyMethod()
               .AllowAnyOrigin()
               .AllowCredentials()
               .WithExposedHeaders("Location"); // params string[]
    });
});
24
Kirk Larkin