Dans l'une des applications ASP.NET MVC, nous souhaitons vous déconnecter automatiquement de l'utilisateur s'il ferme l'onglet Navigateur dans lequel l'application est ouverte. P>
Nous utilisons le code suivant lorsqu'il authentifie. p>
FormsAuthentication.settauthcookie (nom d'utilisateur, false) p>
Dès maintenant, si nous fermons la fenêtre du navigateur et que nous le relâchons, les utilisateurs sont invités à s'authentifier à nouveau. Mais nous voulons demander aux utilisateurs d'authentifier à nouveau s'ils ferment l'onglet et tentent d'accéder à l'une des URL du site Web. P>
5 Réponses :
Je n'ai pas essayé cela moi-même, mais je pense que l'approche suivante devrait fonctionner: p>
du côté du client, vous pouvez utiliser l'événement Onunload de votre document pour lancer une fonction JavaScript qui appellerait votre méthode de signalisation côté serveur via AJAX. p>
du côté serveur, vous devez avoir la méthode d'action Call FormsAuthentication.signout () et Session.Abandon (); p>
Soyez prudent avec cela, cependant, comme l'incendie Onunload lors de la navigation loin de la page. Et autant que je sache, il n'y a pas de moyen de vérifier si l'utilisateur navigue ou ferme ...
Le déchargement est tiré avant de passer à chaque page du site Web. Mais je veux gérer la fermeture de l'onglet.
Désolé, j'ai oublié que vous n'écrivez peut-être pas un site Web Ajax. Je charge tout nouveau contenu via des appels Ajax (à l'aide d'un plugin JQuery sur mesure), donc je reçois simplement un déchargement lorsque l'onglet ou la fenêtre est fermée.
Un navigateur efface toutes les objets Session Scoped uniquement lorsqu'il est complètement fermé, et non lorsqu'un onglet individuel est fermé. P>
Une façon d'utiliser un délai d'attente de session très faible et d'avoir un script de script de serveur toutes les quelques secondes pour toucher un objet sur la page. Cela étendra à nouveau le temps de la session. Donc, si un onglet est fermé, le script ne peut pas trouver l'objet, permettant ainsi à la session de délai d'attente. Un problème ici est si votre application est sur une charte assez élevée, votre application pourrait-elle lui-même! P>
Nous avons décidé d'utiliser un cookie moins d'authentification afin que le jeton d'authentification fait partie de l'URL. Lorsque l'onglet est fermé et qu'elles ouvrent à nouveau le site Web, il vous sera demandé d'authentifier à nouveau :) P>
Cela signifie que les jetons d'authentification vont être enregistrés dans beaucoup d'autres endroits, alors vous attendez - de nombreux pare-feu d'entreprise et d'autres filtres jouent de l'URL. Même vos propres journaux de sites Web leur montreront (ce qui signifie que vous venez de donner à n'importe quel administrateur réseau ou employé du centre de données avec un fichier de base accédant à la possibilité d'imiter les utilisateurs en copiant l'URL à partir du fichier journal IIS / Apache standard)
J'ai redirect pour me déconnecter dans la balise corporelle, le déchargement, vérifier ceci: Stackoverflow.com/a/60840992/747897
En réalité, il n'est pas possible que nous puissions vous déconnecter de l'utilisateur lorsque l'utilisateur ferme l'onglet Navigateur. La seule façon pour cela est de vérifier si l'utilisateur est authentifié lorsque nous appelons la méthode de connexion dans le contrôleur.
Ce code est un exemple de la façon dont je le fais dans ASP.NET MVC 3. P>
public ActionResult LogOn()
{
if (Request.IsAuthenticated)
{
FormsAuthentication.SignOut();
return RedirectToAction("Index","ProductManager");
}
return View();
}
Vous pouvez simplement utiliser des variables de session pour vous déconnecter automatiquement quiconque tente de revenir à la page de destination sécurisée. Créez une variable de session unique (entier ou booléen) et dans l'événement ONCLICK de votre bouton de connexion, réinitialisez-le à un état connu après avoir accusé de réception que l'utilisateur dispose d'un identifiant valide, définissez ou incrémentez la variable de session dans l'événement Page_Load de la page. sécuriser. Testez ces valeurs et sanctionnez l'utilisateur s'il tente de revenir à la page ou de ne rien faire si sinon. Le code peut sembler similaire à celui-ci.
protected void btnLogin_Click(object sender, EventArgs e)
{
if (IsAuthenticated == true)
Session["IsUserLoggedIn"] = (int)0;
}
protected void Page_Load(object sender, EventArgs e)
{
if (HttpContext.Current.User.Identity.IsAuthenticated == true)
{
if (Session["IsUserLoggedIn"] != null)
{
int IsUserLoggedIn = (int)Session["IsUserLoggedIn"];
if (IsUserLoggedIn <= 0)
{
Session["IsUserLoggedIn"] = (int)IsUserLoggedIn + 1;
}
else
{
Session["IsUserLoggedIn"] = (int)0;
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
}
}
else { Session["IsUserLoggedIn"] = (int)0; }
}
Cette approche a un bug grave. Après vous connecter si je rafraîchis la page d'accueil où dans la page ci-dessus a été implémentée, elle me déconnecte.
Je questionne la fonctionnalité. Et si l'utilisateur a votre site ouvert dans deux onglets et ferme une?
Il n'y a aucune façon fiable de faire cela et je ne vois aucune raison de mettre en œuvre une telle fonctionnalité i>.
Je peux comprendre le besoin de cela si vous essayez de rendre compte des utilisateurs simultanés.