1

私のASP.NETイントラネットWebアプリケーションはWindows認証を使用していますが、次の詳細を記録したいと思います。

1)Windows ID
2)セッション開始時間
3)セッション停止時間
4)参照されているURL(オプション)

Global.ASAXの「Session_Start」メソッドにいくつかの基本的なコード設定があり、セッションの開始時刻をログに記録します(以下を参照)が、これまでのところこれで終わりです。これは原始的なアプローチであり、これを行うための「より良い」方法があると私は感じています。だから私は本当に2つの質問があります:

1)これはこれを行うための正しい方法ですか?そうでない場合、他のいくつかのオプションは何ですか?

2)これが正しい方法である場合、「Session_End」メソッドにコードをドロップして、終了時間を記録する必要がありますか?それは完全な解決策ですか?このメソッドは、サイトを開いているブラウザータブを閉じるときに常に呼び出されますか、それともブラウザー全体を閉じる必要がありますか(ログアウト機能はありません)?ユーザーがこのセッション終了メソッドをスキップする(またはその場合は開始する)方法はありますか?

    Dim connsql As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("MyConnectionstring").ConnectionString)
    Dim cmdsql As System.Data.SqlClient.SqlCommand = connsql.CreateCommand
    cmdsql.CommandText = "BeginUserSession"
    cmdsql.CommandType = Data.CommandType.StoredProcedure
    Try
        cmdsql.Parameters.Add("@windowsid", System.Data.SqlDbType.VarChar, 30, "windowsid")
        cmdsql.Parameters("@windowsid").Value = Session("UserInfo").identity.name
        If connsql.State <> System.Data.ConnectionState.Open Then connsql.Open()
        cmdsql.ExecuteNonQuery()
        connsql.Close()

    Catch ex As Exception

    Finally
        If connsql.State <> Data.ConnectionState.Closed Then connsql.Close()
    End Try
    'Stored Proc records start time
4

3 に答える 3

2

Session_Endは信頼できません。

私が提案するのは、Session_Startで、セッションが作成された時刻を記録するレコードを作成し、Session_Endで、レコードが終了した時刻でレコードを更新することです。

受動的に放棄されたセッションの大部分を処理するには、Application_BeginRequestを使用してレコードを更新し、ユーザーが「最後に見た」日時を記録します。

次に、受動的に放棄されたセッションをマークする方法を決定する必要があります。これはサイト/アプリ固有になります。それは、セッションが放棄されたと見なされる前に経過しなければならない分数を選択するのと同じくらい簡単かもしれません-10分など。

したがって、クエリがあります。

SELECT Username,
       SessionStart,
       SessionEnd,
       LastSeenOn,
       DATEDIFF(mi, SessionStart, ISNULL(SessionEnd, LastSeenOn)) DurationMinutes
FROM   SessionAudit
WHERE  SessionEnd IS NOT NULL
OR     DATEDIFF(mi, LastSeenOn, getdate()) > 10

これにより、セッション監査ログが返されます。

于 2010-02-01T22:49:49.013 に答える
1

あなたのアプローチは単純なものとして説明することができますが、それはまったく問題ないかもしれません-それは要件が何であるかにかかっています。アプリケーションのエラーと警告の完全なスイートをログに記録する必要がある場合は、Log4Netのようなものの実装を検討してください。そうでなければ、私はあなたがしていることに何か問題があるとは言いません。

タイムアウト値で指定された時間、ユーザーアクティビティがなかった場合、またはコードでSession.Abandon()を明示的に呼び出した場合、セッションは終了します。HTTPはステートレスであるため、ユーザーがサイトを離れたか、ブラウザーを閉じたか、またはセッションとの対話を停止したかどうかを判断する方法はありません。

于 2010-02-01T22:43:31.337 に答える
0

セッションの終わりを正確に把握できるかどうかはわかりません。

  1. ユーザーはブラウザを閉じることができますが、必ずしもセッションが終了するわけではありません。
  2. その後、サイトに戻ることができるため、複数のセッションが発生する可能性があります。

IISの設定をいじって、非アクティブになった後すぐにセッションを強制終了することができますが、それは良い考えではありません。

また...ユーザー全員が内部ネットワーク上にいない場合、ユーザーが「WindowsID」を持っているかどうかを制御することはできません。

于 2010-02-01T22:40:57.897 に答える