2

MVC アクションの出力をキャッシュしたいと思います。でも:

1)OutputCacheAttributeグローバルに適用すると、すべてのユーザーのすべてがキャッシュされるため危険です。

2)OutputCacheAttributeグローバルに適用しAuthorizeてから、承認が必要なアクションに属性を適用しても、問題は解決しません。ユーザーが承認されているかどうかに関係なく、すべての出力は引き続きキャッシュされます。

3) OutputCacheAttribute(グローバルではなく) 選択したアクションのみに適用しAuthorizeAttribute、承認を必要とするすべてのアクションを適用する場合、セキュリティ上の脅威はありませんが、パフォーマンス コストが発生します。認証が必要なすべてのページは、新しい Http リクエストを作成する必要があります。

ユーザーが認証されている場合にのみ、選択したページや選択したタイプのリクエスト (HTTP GET) がクライアントにキャッシュされるように、妥協点を見つけたいと考えています。ユーザーがログアウトして、キャッシュされたページ/アクションの URL にアクセスした場合、コンテンツを表示できないようにする必要があります。

これを実装する方法はありますか?

4

1 に答える 1

2

VaryByCustom is what you want. これを Global.asax ファイルに入れます。

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    // use this algorithm to determine cacheability for "IsAuthenticated"
    if ("IsAuthenticated".Equals(custom, StringComparison.OrdinalIgnoreCase))
    {
        // cache content when user is authenticated
        if (User.Identity.IsAuthenticated) return "true";

        // do not cache when user is not authenticated
        return null;
    }

    return base.GetVaryByCustomString(context, custom);
}

...次に、キャッシュするアクション メソッドで次のようなものを使用します。

[OutputCache(VaryByCustom = "IsAuthenticated", Duration = 1800,
    Location = OutputCacheLocation.Client)]
public virtual ActionResult Index()
{ ... }
于 2013-03-19T13:20:49.023 に答える