web-dev-qa-db-ja.com

ASP.Net Core:X-Frame-オプションの奇妙な動作

Iframeのコンテンツをレンダリングするアクションの一部から_X-Frame-Options: SAMEORIGIN_ヘッダーを削除する必要があります。デフォルトでリクエストに追加されている限り、_Startup.cs_:services.AddAntiforgery(o => o.SuppressXFrameOptionsHeader = false);で無効にしました。次に、簡単なミドルウェアを作成しました。

_    app.Use(async (context, next) =>
    {
        context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");

        await next();
    });
_

クロスドメインリクエストに応答するために必要なアクションは、結果フィルター属性で装飾されています。

_    public class SuppresXFrameOptionFilter : ResultFilterAttribute
    {
        public override async Task OnResultExecutionAsync(ResultExecutingContext context,
ResultExecutionDelegate next)
        {
            context.HttpContext.Response.Headers.Remove("X-Frame-Options");

            await next();
        }
    }
_

これが堕落です。フィルタが最終的に期待どおりに機能するにもかかわらず、最初のクロスドメイン要求は失敗します。これは、応答に_X-Frame-Options: SAMEORIGIN_がまだ存在するためです(ミドルウェアのnext()の後にチェックしました-ヘッダーが再表示されました)。 F5キーを押すと、ヘッダーが応答に含まれなくなり、すべてが正常に機能します。これは_X-Frame-Options_ヘッダーでのみ発生し、カスタムヘッダーは正しく削除されます。削除された_X-Frame-Options_が応答に再び表示されるのはなぜですか?

11
Slip

最初のリクエストで Antiforgery Cookieを保存します。これは、X-Frame-Optionsヘッダーも設定しようとすることを意味します。

Antiforgeryでそのヘッダーを無効にし、手動で処理する場合は、SuppressXFrameOptionsHeaderをtrue;)に設定します。

services.AddAntiforgery(o => o.SuppressXFrameOptionsHeader = true);
15
Daniel J.G.