2

概要: 顧客エリアと管理エリアを持つシステムを作成しました。どちらのエリアにも異なるログインページがあります。ユーザーは、管理エリアでユーザーAとしてログインすると同時に、顧客エリアでユーザーBとしてログインできます。

顧客または管理エリアのいずれかからユーザーがログアウトすると、が呼び出され、顧客エリアと管理エリアの両方で発生したくないSession.Abandon()セッションが削除されます

質問:他のエリアのセッションに影響を与えることなく、ログアウト時にセッションを中止できますか?(例:顧客エリアからログアウトするときは、管理エリアにログインしたままにする必要があります)

更新:これを回避できることはわかってSession.Clear()いますが、セキュリティ上のリスクが発生する可能性があります。

4

2 に答える 2

1

セッションの顧客IDが0より大きいか、ユーザー名が空ではないか、ipがリモートADDRと等しいかどうかをチェックする関数を記述します。

customer_id、customer_username、およびIP(セキュリティ用)をセッションに保存し、それらのみをクリアします。関数を呼び出すと、そのユーザーは顧客として署名されていないことが返されます。

同じことが管理者にも当てはまります。

セッションを破棄(放棄)し、存続させ、追加情報を保存する必要はありません。

public bool IsLoggedIn()
{
    // You will have to check for the keys, if they are present in the Session container, first.

    if(!Session.Containts("customer_id")
            || !Session.Contains("customer_username")
            || !Session.Contains("customer_ip"))
        return false;

    return Session["customer_id"] > 0
        && String.IsNullOrEmpty(Session["customer_username"])
        && Session["customer_ip"] = Request.ServerVariables("REMOTE_ADDR")
}

public void LogOut()
{
    Session.Remove("customer_id");
    Session.Remove("customer_username");
    Session.Remove("customer_ip");
}
于 2012-08-23T09:51:55.860 に答える
0

問題の核心は、通常、1つのasp Webアプリケーションに対して、物理ユーザーのブラウザーごとに1つのセッション(*)しかないことです。サイト/フレーム/サーバーコード構造にいくつかの本当に深刻な変更がなければ、いくつかの並列セッションを作成して維持することはできません。Pages and Controlsによって提供される「.Session」ハッシュマップでさえ、常に同じキー/値を表示します。

Webアプリの一部は異なるキーを使用するため、交差しない「レイヤー」または「モジュール」をエミュレートする場合がありますが、それでもこれは1つのストレージにすぎません。

したがって、Session-Abandonを呼び出すと、すべてが失われます。これは、セッションが1つしかないためです。

あなたができる唯一のことは、Roliceがここで並行して答えたように、適切なエントリを手動で選択的にクリアすることです:)

(*)実際には、Session-Abandonを実行しても、セッションを削除/破棄することはありません。まだ1つのセッションがあります。すべてのデータを忘れてしまい、今は「空」=新しいようになっています。ええと、それはおそらく古いクッキーを削除します、私は覚えていませんが、それらは次のページのレンダリングですぐに新しい新しいキーで再作成されるので...かなりすぐに。

于 2012-08-23T09:56:41.123 に答える