2009-09-17 20 views
5

私はASP.NET MVCのキャッシングと承認に混乱しています。承認とASP.NET MVCのキャッシング

私自身の許可属性はAuthorizeAttributeから継承されています。コントローラーアクションに[OutputCache]属性を設定しても、オーバーライドされたAuthorizeCoreメソッドが毎回実行されます。私はその部分を理解しています。

私にとって心のベンダー:AuthorizeCoreになります。今度は実際に出力キャッシュを行い、キャッシュからページが提供される度に。その理由は、要求がキャッシュされるとき、AuthorizeCoreで提供されるhttpContext.Sessionnullです。ここではいくつかの単純化されたコードです:

protected override bool AuthorizeCore(HttpContextBase httpContext) { 
    return (Session["userId"] != null) 
} 

だからhttpContext.Sessionnullであれば、これは明らかに毎回失敗します。セッションにアクセスする必要があります。要求が承認されていれば、どうすれば確認できますか?これは意味をなさない - もしこれがどうすればいいのですか?は、ASP.NET MVCの認証と一緒にキャッシュされたページを使うことはできません。助けて?

答えて

11

二つの別々の質問があります。

  1. はMVCでのキャッシングでの認証作業をしていますか?
  2. セッションは、キャッシュの面で認証前に機能しますか(認証されていないユーザーの場合でも、依然としてユニークなセッションが残っています)。

答えはそれぞれyesとnoです。認証はキャッシュでうまく動作します。 SQLまたはドメインメンバシッププロバイダで試してみてください。わかるでしょ。

ただし、認証モジュールの前にキャッシュを実行できます。 (ボーナスポイントはなぜですか?)認証は、(AuthorizeAttributeのように)キャッシュを具体的にフックする場合にのみ呼び出されます。セッションはユーザー固有のものなので、はありません。は、あなたがAuthorizeCore内でセッションを持つことを保証しません。

その他の特典:キャッシュ設定でvaryByUserを指定した場合、どのように変更されるのですか?

残念ながら、あらゆる種類のセキュリティ権を行うのは難しいため、認証の権利を行うのは難しいです。マイクロソフトはメンバーシッププロバイダAPIを使用してこれを簡単にしようとしています。 I strongly recommend using thatカスタム認証を実装する場合また、組み込みプロバイダを使用して、可能な限り書き換えるのではなく、それらを拡張することもお勧めします。

もう1つの点:ASP.NETセッションプロバイダとASP.NETメンバーシッププロバイダは、それぞれ分離しています。異なるメンバーシップユーザーがセッションを共有(!)することができ、yesの場合、attackのようにサイトをこのようにすることができます。 決してセキュリティ関連の情報をセッションに入れても安全です。セキュリティは難しい。

+0

通常のasp.netメンバーシップ・プロバイダに基づいてカスタム・メンバーシップ・プロバイダを使用するのであれば、キャッシュでユーザー認証をチェックできますか?それがなぜ機能するのですか?メンバーシッププロバイダは内部的にはセッションも必要ですか? – Alex

+1

セキュリティセンシティブ情報をSessionに完全に格納することは決して安全ではありません。 –

+1

そして、正規のメンバーシッププロバイダは、Sessionとはまったく関係ありません。私の答えの最後の2つのリンクを読んでください。 –