ASP.NETブラウザ キャッシュ無効化

ASP.NETでは以下のメソッドで制御できる
Response.Cache.SetCacheability(HttpCacheability.NoCache);


しかし、IEには効いているみたい(有効期限切れのページが表示される)だが、
FireFoxChromeなんかは、普通に(ブラウザ独自の?)キャッシュから読み取って表示される。

そこで、下記のツール使ってHTTPヘッダの中身を調べてみた。
@IT:Security Tips > LiveHTTPHeadersでHTTPヘッダ情報を確認する

すると・・・

Cache-Control: no-cache
Pragma: no-cache
Expires: -1

として出力されている。


無効化のためには、HTTPヘッダに

expires:十分過去の日付
Cache-Control:no-cache,no-store,must-revalidate
pragma:no-cache

とするのが良いそうなので、
Response.AppendHeader("Cache-Control", "no-cache,no-store,must-revalidate");
と書いてみたが、
出力結果は
デフォルト値のCache-Control:private
だった。
ちなみに、ヘッダタグ内のmetaタグに直接こうやって書いてみたが、
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Thu, 01 Dec 1980 16:00:00 GMT">
あっさりCache-Control:privateのままだった。


どうやらAppendHeaderメソッドではCache-Controlを追加することはできず
Response.Cache.SetCacheabilityを使用するか、
Response.CahceControlを使用するしかなさそう。(MSはResponse.CahceControlに直接セットする事は非推奨らしい)
しかも、その引数はHttpCacheability列挙体のものしか使えないので、「no-store,must-revalidate」の設定はここでは無理のよう。。。

ただ、no-storeをセットするにはそれ用のメソッドがある。
Response.Cache.SetNoStore();
OutputCacheProfile.NoStore Property (System.Web.Configuration) | Microsoft Docs

なので、最終的には

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

としました。


参照とか、役立ちそうなリンク:
IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第5章 暴露対策:プロキシキャッシュ対策
HttpResponse.AppendHeader(String, String) Method (System.Web) | Microsoft Docs
HttpCacheability Enum (System.Web) | Microsoft Docs
ブラウザ のキャッシュを制御する/no-cache
http://www.isla-plata.org/wiki/pukiwiki.php?%B3%AB%C8%AF%A5%EA%A5%BD%A1%BC%A5%B9%2F.Net%2FASP.Net%A4%C7%A5%D6%A5%E9%A5%A6%A5%B6%A5%AD%A5%E3%A5%C3%A5%B7%A5%E5%A4%CE%CC%B5%B8%FA%B2%BD