web-dev-qa-db-ja.com

ASP.NETでは、Session.Abandon()ではなくSession.Clear()をいつ使用する必要がありますか?

Session.Clear()とSession.Abandon()の両方がセッション変数を取り除きます。私が理解しているように、Abandon()は現在のセッションを終了し、新しいセッションを作成するため、EndイベントとStartイベントが発生します。

ユーザーのログアウトなど、ほとんどの場合にAbandon()を呼び出すことが望ましいようです。代わりにClear()を使用するシナリオはありますか?パフォーマンスに大きな違いはありますか?

110
Lance Fisher

Session.Abandon()セッションを破棄するおよびSession_OnEndイベントがトリガーされます。

Session.Clear() just すべての値を削除(コンテンツ)オブジェクトから。同じキーを持つセッションはまだ生きています。

したがって、Session.Abandon()を使用すると、その特定のセッションが失われ、ユーザーは新しいセッションキーを取得します。たとえば、ユーザーがログアウトするときに使用できます。

ユーザーを同じセッションに残したい場合(たとえば、ユーザーに再ログインさせたくない場合)にSession.Clear()を使用し、すべてのセッション固有のデータをリセットします。

165
splattne

ユーザーがログアウトするときにのみSession.Clear()を使用すると、セキュリティホールが発生する可能性があります。 Webサーバーに関する限り、セッションはまだ有効です。その場合、セッションIDをスニッフィングして取得し、そのセッションをハイジャックするのはかなり簡単なことです。

このため、ユーザーをログアウトする場合、Session.Abandon()を使用してセッションを破棄し、新しいセッションを作成する方が安全で賢明です(ログアウトUIページが新しいセッションの一部であっても、新しいセッションにはユーザーの詳細は含まれず、新しいセッションをハイジャックすることは新しいセッションを持つことに等しいため、ミュートされます。

13
shabbirh

Session.Abondon()Session.Clear()を使用する実際の例が何であるかはまだわかりません。

ユーザーがログアウトリンクをクリックして、「ログアウトしました」ページに移動した場合...ブラウザセッションはまだ継続していますが、セッションに保存されている情報を削除したいのです。セッションを放棄した場合、「ログアウトしました」ページの新しいセッションがすぐに作成されます。

5
nick

Session.Abandonは前述のようにセッションを破棄するため、誰かをログアウトするときにこれを使用する必要があります。 Session.Clearは、eコマースWebサイトの買い物かご用です。これにより、ユーザーをログアウトせずにバスケットがクリアされます。

3
Kasim Shafiq

私はこの問題を抱えて両方試してみましたが、「pageEditState」のようながらくたを削除することで解決しなければなりませんでしたが、ユーザー情報を削除せずに再度検索する必要がありました。

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
0
MatthewMartin