ASP.NET - время начала и окончания сеанса пользователя для журнала аудита - Global.ASAX?

Мое веб-приложение интрасети ASP.NET использует проверку подлинности Windows, и я хотел бы записать следующие сведения:

1) Windows ID
2) Время начала сеанса
3) Время окончания сеанса
4) Просматриваемый URL (необязательно)

У меня есть базовая настройка кода в методе «Session_Start» файла Global.ASAX для регистрации времени начала сеанса (см. Ниже), но это пока что. У меня такое чувство, что это примитивный подход, и есть «лучшие» способы сделать это. Так что у меня действительно два вопроса:

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

person Albert    schedule 01.02.2010    source источник


Ответы (3)


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

Что вернет ваш журнал аудита сеанса.

person Bryan Batchelder    schedule 01.02.2010

Ваш подход можно описать как простой, но это вполне нормально - все зависит от требований. Если вам нужно регистрировать полный набор ошибок и предупреждений приложения, посмотрите на реализацию чего-то вроде Log4Net. В противном случае я бы не сказал, что что-то не так с тем, что вы делаете.

Сеансы завершаются, если в течение времени, указанного в значении тайм-аута, пользователь не выполнял никаких действий, или когда вы явно вызываете Session.Abandon () в своем коде. Из-за того, что HTTP не имеет состояния, невозможно определить, покинул ли пользователь ваш сайт, закрыл браузер или иным образом перестал взаимодействовать со своим сеансом.

person womp    schedule 01.02.2010

Я не уверен, что вы точно поймете конец сеанса, потому что

  1. The user can close their browser and that will not necessarily end the session.
  2. They can then go back to your site and thus may have multiple sessions.

Вы можете попробовать изменить настройки в IIS, чтобы очень быстро завершить сеанс после бездействия, но это не лучшая идея.

Также ... Если не все пользователи находятся во внутренней сети, вы не сможете контролировать, имеют ли они «Windows ID» или нет.

person AGoodDisplayName    schedule 01.02.2010