Question

Mon application web intranet ASP.NET utilise l'authentification Windows, et je voudrais enregistrer les détails suivants:

1) ID Windows
2) Session Start Time
3) Session Stop Time
4) URL en cours d'exploration à (en option)

J'ai une certaine configuration de code de base dans la méthode « Session_Start » du Global.asax pour se connecter les heures de début de la session (vu ci-après), mais c'est jusqu'à présent. J'ai le sentiment que c'est une approche primitive et il existe des moyens « meilleurs » de le faire. J'ai donc vraiment deux questions:

1) Est-ce la bonne façon de s'y prendre pour le faire? Sinon ce sont d'autres options?
2) Si cela est la bonne façon, dois-je juste besoin de laisser tomber un peu de code dans la méthode « Session_End » pour enregistrer le temps leur sortie, et c'est une solution complète? Est-ce que cette méthode toujours appelé quand ils se ferment l'onglet du navigateur qu'ils ont le site ouvert, ou doivent-ils fermer le navigateur entier (je n'ai pas la fonctionnalité de fermeture de session)? Tous les utilisateurs de façon peuvent ignorer cette méthode de fin de session (ou commencer pour ce cas)?

    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
Était-ce utile?

La solution

Session_End n'est pas fiable.

Ce que je suggère est Session_Start vous créez un enregistrement qui note l'heure de la session a été créée, et Session_End vous mettez à jour l'enregistrement avec le temps, il a pris fin.

Pour faire face à la majorité des séances qui sont passivement abandonnèrent, utilisez Application_BeginRequest de mettre à jour l'enregistrement à noter lorsque l'utilisateur a été « la dernière fois ».

Vous devrez ensuite déterminer une façon de marquer des sessions qui ont été abandonnées passivement. Ce sera le site / application spécifique. Il pourrait être aussi simple que de choisir un certain nombre de minutes qui doit passer avant la session est considérée comme abandonnée -. Comme 10 minutes

Alors vous avez une requête:

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

Ce qui ramènera votre journal d'audit de session.

Autres conseils

Votre approche pourrait être décrite comme simple, mais cela pourrait être tout à fait bien - il se résume à ce que les exigences. Si vous devez vous connecter une suite complète d'erreurs d'application et mises en garde, regardez la mise en œuvre quelque chose comme Log4Net. Sinon, je ne dirais pas qu'il ya quelque chose de mal à ce que vous faites.

Les séances sont terminées quand il a eu aucune activité d'utilisateur pour le laps de temps spécifié dans la valeur de délai d'attente, ou lorsque vous appelez explicitement Session.Abandon () dans votre code. En raison de la nature sans état de HTTP, il n'y a aucun moyen de savoir si un utilisateur a quitté votre site, fermé le navigateur ou autrement cessé d'être interactif avec leur session.

Je ne suis pas sûr que vous pouvez attraper la fin de la session avec précision en raison

  1. L'utilisateur peut fermer son navigateur et qui se terminera pas nécessairement la session.
  2. Ils peuvent ensuite revenir à votre site et peut ainsi avoir plusieurs sessions.

Vous pouvez essayer de jouer avec la mise dans IIS pour tuer la session très rapidement après l'inactivité, mais ce ne est pas une bonne idée.

De plus ... Si les utilisateurs ne sont pas tous sur un réseau interne, vous aurez aucun contrôle quant à savoir si elles ont un « ID Windows » ou non.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top