4

Is there a way to be notified when a user becomes logged out with an ASP.net website?

Note: A user can become logged out without visiting or clicking a "logout" link.

When a user is logged out i want to fetch clear some session related information, and write to a database.

注:イベントがありLoginStatus.OnLoggedOutます。問題は、そのコントロールがすべてのページに存在するわけではなく、ユーザーがLoginStatusログアウトするためにコントロールを使用する必要がないことです (たとえば、ログインがタイムアウトしたとき、またはユーザーがログアウトしたとき)。

Global.asax にグローバルな On Session Stop 通知があるのと同じように:

void Session_End(object sender, EventArgs e) 
{
}

どこかにOn User Logged Out通知があると思います:

void LoggedOut(object sender, EventArgs e)
{
}

ボーナスリーディング

4

3 に答える 3

2

同意しません。ユーザーがいつログアウトするかを知りたい場合があります。たとえば、ログインしているすべてのユーザーをスキャンして、管理レベルで「誰かが家にいる」かどうかを確認する必要があるアプリケーションがあります。管理者がサイトを閲覧していても、実際にはログインしていない場合があります。管理者は最近ログアウトしたものの、まだサイトを閲覧しており、ソフトウェアはそれを知る必要があるため、セッションがまだアクティブである可能性があります。

この場合、ユーザー名と IP アドレス、ユーザー名などを含むログイン イベントとデータをキャッチする HttpRuntime.Cache ロジックを作成しました。このメソッドは次の場所で呼び出されます。

public static void Application_AuthenticateRequest(オブジェクト送信者, EventArgs e)

次に、そのデータを使用して、ログイン ステータスやその他の有用なアプリケーションの詳細を計算するロジックを実行します。

以下は簡単でテストされていませんが、この種の質問をしている場合は、クリーンアップできると確信しています:)。お役に立てば幸いです。

 public static void HandleUserLoginLogic()
    {
        string UserName = HttpContext.Current.User.Identity.Name.ToString();
        if (UserName != null)
        {
            // if the user has logged in but we have not performed logic, do it now
            if (HttpRuntime.Cache["Authenticated_" + UserName] == null)
            {
                // absolutely confirm the user has logged in
                if (UsrMan.IsUserLoggedIn())
                {
                    // SETUP MY RUNTIME VARIABLES NOW
                    HttpRuntime.Cache["AuthenticatedIPAddress_" + System.Web.HttpContext.Current.Request.UserHostAddress] = UserName;
                    HttpRuntime.Cache["Authenticated_" + UserName] = true;
                    String[] roles = UsrMan.GetRolesForUser(UserName);
                    // handle roles for this user for future application uses in the future.
                    foreach (string role in roles)
                    {
                        // handle first time condition
                        if (HttpRuntime.Cache["AuthenticatedUserInRole_" + role] != null)
                        {
                            StringCollection scUserRole = (StringCollection)HttpRuntime.Cache["AuthenticatedUserInRole_" + role];
                            if (!scUserRole.Contains(UserName))
                            {
                                scUserRole.Add(UserName);
                                HttpRuntime.Cache["AuthenticatedUserInRole_" + role] = scUserRole;
                            }
                        }
                        // handle standard condition
                        else
                        {
                            StringCollection scUserRole = new StringCollection();
                            scUserRole.Add(UserName);
                            HttpRuntime.Cache["AuthenticatedUserInRole_" + role] = scUserRole;
                        }
                    }
                }
            }
        }

        // HANDLE LOGGED OUT CONDITION
        if ((HttpRuntime.Cache["AuthenticatedIPAddress_" + System.Web.HttpContext.Current.Request.UserHostAddress] != null) && (UserName == null))
        {
            string OldUserName = HttpRuntime.Cache["AuthenticatedIPAddress_" + System.Web.HttpContext.Current.Request.UserHostAddress].ToString();
            HttpRuntime.Cache["Authenticated_" + OldUserName] = null;
            String[] roles = UsrMan.GetRolesForUser(UserName);
            foreach (string role in roles)
            {
                StringCollection scUserRole = (StringCollection)HttpRuntime.Cache["AuthenticatedUserInRole_" + role];
                scUserRole.Remove(UserName);
                if (scUserRole.Count > 0)
                    HttpRuntime.Cache["AuthenticatedUserInRole_" + role] = scUserRole;
                else
                    HttpRuntime.Cache["AuthenticatedUserInRole_" + role] = null;
            }
        }
    }
    public static bool IsUserLoggedIn()
    {
        bool result = false;
        if (HttpContext.Current.User != null &&
      HttpContext.Current.User.Identity != null
          && HttpContext.Current.User.Identity.IsAuthenticated)
        { result = true; }
        return result;
    }
于 2013-01-11T07:07:55.923 に答える
1

Web サイトの根本的な問題は、ユーザーがブラウザーを閉じた場合、Web サイトが認識できないことです。その意味は、より良い解決策を示しています。Web サイトに「ログイン」することの意味を再考する必要があります。

「ログイン」がないため、ユーザーがいつ「ログアウト」したかを知る必要がある理由は通常ありません。ユーザーがページにアクセスするたびに、Web サーバーはユーザーが誰であるかを認証します。これが経由するかどうか:

  • NTML
  • ケルベロス
  • HttpAuth
  • セッションクッキー
  • 永続的なクッキー
  • 他のメカニズム (例: IPv6 アドレス)

ユーザーは、ページが読み込まれるたびに「ログイン」します。ブラウザーがページをフェッチした後、ユーザーは存在しなくなります (Web サーバーに関する限り)。これは、ページが取得されるとすぐにユーザーが「ログアウト」することを意味します。

でもログインが遅い

特別なログオン イベントを持つ通常の理由は、ユーザーの情報 (名前、権限など) をキャッシュできるようにするためです。ページを単に更新するたびにコストのかかるデータベース フェッチを行うのではなく、キャッシュからフェッチしないのはなぜでしょうか? しかし、優れた開発者として、不要になった情報を期限切れにする必要もあります。しかし、ユーザーがWeb サイトの使用をいつ「終了」したかを知る方法がないため、キャッシュされた情報をいつフラッシュするかを知る方法はありません。

したがって、キャッシュしないでください。

SQL Server には、非常に高度な一連のデータ キャッシュ メカニズムがあります。もう一度データを照会するだけです。

別の誘惑として、データをユーザーのSession. それは完全に有効です。セッションが終了するまで、情報はそこに残ります。しかし、メモリを消費するため、データを に格納することに反対する人が多くSessionいます。彼らは、代わりに SQL Server のようなデータベースに保存することを主張しています。これは、 SQL Server でもう一度クエリを実行するだけです。

情報を取得するのに費用がかかる、または時間がかかる場合は、それをキャッシュできますが、キャッシュとして設計された cached を使用します。

Page.Cache

これはのエイリアスです

Page.Application.Cache
于 2012-12-01T18:07:00.150 に答える
0

実際にユーザーをログアウトするときのロジックを実装するのは大したことですか? または、よりグローバルに処理する場合は、イベントを作成してサブスクライブし、イベント駆動になるようにします...

于 2012-06-12T19:43:19.823 に答える