承認とASP.NET MVCキャッシング
-
10-07-2019 - |
質問
ASP.NET MVCのキャッシングと承認について混乱しており、明確化が急務です。
自分で作成した承認属性は、 AuthorizeAttribute
を継承します。オーバーライドされた AuthorizeCore
メソッドは、コントローラーアクションで [OutputCache]
属性を設定しても、毎回実行されます。私はその部分を理解しています。
今、私にとって心のベンダー: AuthorizeCore
は、実際に出力キャッシュを行うたびに失敗し、キャッシュからページが提供されます。その理由は、リクエストがキャッシュされるとき、 AuthorizeCore
で提供される httpContext.Session
は null
!?簡単なコードを次に示します。
protected override bool AuthorizeCore(HttpContextBase httpContext) {
return (Session["userId"] != null)
}
したがって、 httpContext.Session
が null
の場合、これは明らかに失敗します。ただし、セッションにアクセスする必要がありますが、リクエストが承認されているかどうかを確認するにはどうすればよいですか?これは意味をなさない-これがどうあるべきかなら、キャッシュされたページをASP.NET MVCでの認証と一緒に使用することはできません。ヘルプ?
解決
2つの質問があります:
- 認証はMVCのキャッシングで機能しますか?
- キャッシュに直面して認証前にセッションは機能しますか(認証されていないユーザーであっても、一意のセッションを希望している場合でも)
それぞれの答えはyesとnoです。認証はキャッシングで正常に機能します。 SQLまたはドメインメンバーシッププロバイダーで試してください。表示されます。
ただし、キャッシュは、認証モジュールの前に実行できます。 (ボーナスポイントの場合:なぜ?)認証は、(AuthorizeAttributeが行うように)特にキャッシュをフックする場合にのみ呼び出されます。セッションはユーザー固有であるため、AuthorizeCore内にセッションがあることを保証するいいえです。
より多くのボーナスポイント:キャッシュ構成でvaryByUserを指定した場合、これはどのように変化しますか?
残念ながら、あらゆる種類のセキュリティ権限を実行するのは難しいため、認証権限を実行するのは困難です。マイクロソフトは、メンバーシッププロバイダーAPIでこれを簡単にしようとしています。 使用することを強くお勧めしますカスタム認証を実装する場合。また、組み込みのプロバイダーを使用して、可能な限り書き換える代わりに拡張することもお勧めします。
もう1つのポイント:ASP.NETセッションプロバイダーとASP.NETメンバーシッププロバイダーは、完全に独立しています。さまざまなメンバーシップユーザーがセッションを共有(!)でき、はい、攻撃この方法でサイトを攻撃します。セッションにセキュリティ関連の情報を入れることは決して安全ではありません。セキュリティは難しい。